diff --git a/waterwark_remover.sh b/waterwark_remover.sh new file mode 100644 index 0000000..415739c --- /dev/null +++ b/waterwark_remover.sh @@ -0,0 +1,183 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail +trap unexpected_error SIGINT SIGTERM ERR + +usage() { + cat <] [...] + +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) + Seulement ces valeurs en 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 "[Fatal] Une erreur inattendue s'est produite." + else + msg "${PURPLE}[Fatal] 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..." + + 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}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 -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 -i '/{^1 0 0 1 5 5 Tm$/{:a;N;/^ET$}/!ba};/^\(.*\)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