1
0
Fork 0
watermark-remover/waterwark_remover.sh

190 lines
6.7 KiB
Bash

#!/usr/bin/env bash
set -Eeuo pipefail
trap unexpected_error SIGINT SIGTERM ERR
usage() {
cat <<EOF
Usage: ./$(basename "${BASH_SOURCE[0]}") [-h] [-d] [-n] [-r <valeur_DPI>] <fichier_PDF1> [<fichier_PDF2>...]
Ce script supprime les watermarks contenus dans certains fichiers PDF.
Options disponibles:
-h, --help Affiche cette aide et quitte
-d, --debug Active le mode debug (un fichier log est alors créé dans /tmp)
-n, --no-color Désactive la coloration des messages dans le terminal
-r, --resolution Résolution en DPI du nouveau document PDF (par défaut: 300 DPI)
Seules ces valeurs sont supportées : '72', '150' ou '300'
Exemple : ./$(basename "${BASH_SOURCE[0]}") -r 150 file.pdf
EOF
exit
}
unexpected_error() {
trap - SIGINT SIGTERM ERR
if [[ -z ${NOFORMAT+x} ]]; then
msg "[Critique] Une erreur inattendue s'est produite."
else
msg "${PURPLE}[Critique] Une erreur inattendue s'est produite.${NOFORMAT}"
fi
[[ -z ${tmp_dir+x} ]] || cleanup # si la variable 'tmp_dir' n'est pas déclarée, ça n'exécute pas le nettoyage
exit 1
}
cleanup() {
msg "Nettoyage des fichiers temporaires..."
if [[ -z $tmp_dir ]] && [[ -z ${NOFORMAT+x} ]]; then
die "[Critique] La variable 'tmp_dir' est vide pour une raison anormale."
elif [[ -z $tmp_dir ]]; then
die "${PURPLE}[Critique] La variable 'tmp_dir' est vide pour une raison anormale.${NOFORMAT}"
fi
rm -f $tmp_dir/*
rmdir $tmp_dir
unset tmp_dir # pour être sûr que le script ne tente pas d'effacer une 2de fois le dossier tmp
}
setup_colors() {
if [[ -t 2 ]] && [[ -z "${NO_COLOR-}" ]] && [[ "${TERM-}" != "dumb" ]]; then
NOFORMAT='\033[0m' RED='\033[0;31m' GREEN='\033[0;32m' ORANGE='\033[0;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' YELLOW='\033[1;33m'
else
NOFORMAT='' RED='' GREEN='' ORANGE='' BLUE='' PURPLE='' CYAN='' YELLOW=''
fi
}
msg() {
echo >&2 -e "${1-}"
}
die() {
local msg=$1
local code=${2-1} # l'exit status par défaut est 1
msg "$msg"
exit "$code"
}
parse_params() {
# valeurs par défaut des variables params
log_file=/dev/null
resolution=300
while :; do
case "${1-}" in
-h | --help) usage ;;
-n | --no-color) NO_COLOR=1 ;;
-d | --debug)
log_file=/tmp/wmrm-$(date +%Y%m%d-%H%M%S).log
msg "Mode debug activé. Chemin du fichier log : $log_file"
exec {BASH_XTRACEFD}>>$log_file # redirige l'output de `set -x` vers le fichier log
set -x
;;
-r | --resolution)
resolution="${2-}"
shift
;;
-?*) die "Option inconnue : $1" ;;
*) break ;;
esac
shift
done
input_files=("$@")
}
# vérifie les logiciels prérequis
check_deb_pkg() {
dpkg --version &>/dev/null || die "${RED}Erreur : Le gestionnaire de paquet 'dpkg' n'est pas présent sur ce système (utilisez Ubuntu, Linux Mint ou Debian).${NOFORMAT}"
required_pkg=''
for pkg in "$@"; do
dpkg -s $pkg &>/dev/null || required_pkg="$required_pkg $pkg"
done
[[ -z $required_pkg ]] || die "${RED}Erreur : Ce script requiert certains logiciels pour fonctionner. Exécutez la commande suivante pour le/les installer :
sudo apt-get update && sudo apt-get install$required_pkg${NOFORMAT}"
}
# vérifie la présence du/des params requis
check_params_presence() {
[[ ${#input_files[@]} -eq 0 ]] && die "${RED}Erreur : Aucun argument n'a été donné au script.${NOFORMAT}"
return 0
}
parse_params "$@"
setup_colors
check_deb_pkg ghostscript pdftk-java
check_params_presence
# vérification de la validité des arguments
is_arg_invalid=false
for ifile in "${input_files[@]}"; do
if [[ ! -f $ifile ]]; then
msg "${RED}Erreur : Le fichier '$ifile' n'existe pas.${NOFORMAT}"
is_arg_invalid=true
elif ! file -b "$ifile" | grep -q '^PDF document'; then
msg "${RED}Erreur : Le fichier '$ifile' n'est pas de type PDF.${NOFORMAT}"
is_arg_invalid=true
elif ! echo "$ifile" | grep -qi '\.pdf$'; then
msg "${RED}Erreur : Le nom du fichier '$ifile' ne termine pas par la bonne extension ('.pdf' ou '.PDF').${NOFORMAT}"
is_arg_invalid=true
fi
done
$is_arg_invalid && die "${RED}Au moins un argument est invalide (voir erreur ci-haut).${NOFORMAT}"
# sélection de la qualité du/des PDF (et par conséquence de leur taille)
case "$resolution" in
300) pdf_quality=prepress ;;
150) pdf_quality=ebook ;;
72) pdf_quality=screen ;;
*) die "${RED}Erreur : La valeur donnée au paramètre '--resolution' n'est pas supportée (seulement 72, 150 ou 300).${NOFORMAT}" ;;
esac
msg "Résolution sélectionnée : $resolution DPI"
# création du nouveau fichier sans watermark
ofile_index=0
for ifile in "${input_files[@]}"; do
msg "${GREEN}Début du traitement du fichier '$ifile'.${NOFORMAT}"
inputfile_dir=$(dirname "$ifile")
tmp_dir=$(mktemp --directory --tmpdir="$inputfile_dir" .watermark_remover_XXXXXXXXXX)
inputfile_wo_ext=$(echo "$ifile" | rev | cut -d. -f2- | rev)
tmpfiles_prefix=$tmp_dir/$(basename "$inputfile_wo_ext")
msg "Réécriture du document PDF dans un nouveau fichier (ça peut prendre beaucoup de temps)..."
gs -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -dPDFSETTINGS=/$pdf_quality -dAutoRotatePages=/None -dCompatibilityLevel=1.7 -sOutputFile="${tmpfiles_prefix}_1.pdf" "$ifile" &>>$log_file
msg "Décompression du document PDF..."
pdftk "${tmpfiles_prefix}_1.pdf" output "${tmpfiles_prefix}_2.pdf" uncompress verbose &>>$log_file
msg "Suppression du watermark..."
# source de cette commande `sed` : https://stackoverflow.com/a/37681075
sed -ri '/^\(.+\\n.+\\r.+\)Tj$/d' "${tmpfiles_prefix}_2.pdf" &>>$log_file
msg "Recompression du document PDF..."
pdftk "${tmpfiles_prefix}_2.pdf" output "${inputfile_wo_ext}_sansWatermark.pdf" compress verbose &>>$log_file
output_files[$ofile_index]="${inputfile_wo_ext}_sansWatermark.pdf"
ofile_index=$((ofile_index + 1))
msg "Le nouveau fichier sans watermark a été créé avec succès !"
cleanup
done
# affichage des fichiers créés
msg "${GREEN}Le/Les nouveaux fichiers PDF sans watermark sont les suivants :${NOFORMAT}"
for ofile in "${output_files[@]}"; do
msg "${GREEN} - '$ofile'${NOFORMAT}"
done
# À faire :
# - option pour changer l'emplacement du fichier tmp et du fichier output
# - vérifier si fonction unexpected_error est écrite correctement avec le exit 1 à la fin et pas un die
# - vérifier si utilisation de ${VAR+x} est bien justifié