2021-08-06 22:55:09 +02:00
#!/usr/bin/env bash
set -Eeuo pipefail
trap unexpected_error SIGINT SIGTERM ERR
usage( ) {
cat <<EOF
2022-05-24 12:38:02 +02:00
Usage: ./$( basename " ${ BASH_SOURCE [0] } " ) [ -h] [ -d] [ -n] [ -r <valeur_DPI>] <fichier_PDF1> [ <fichier_PDF2>...]
2021-08-06 22:55:09 +02:00
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)
2022-05-24 12:38:02 +02:00
Seules ces valeurs sont supportées : '72' , '150' ou '300'
2021-08-06 22:55:09 +02:00
Exemple : ./$( basename " ${ BASH_SOURCE [0] } " ) -r 150 file.pdf
EOF
exit
}
unexpected_error( ) {
trap - SIGINT SIGTERM ERR
if [ [ -z ${ NOFORMAT +x } ] ] ; then
2022-05-24 12:38:02 +02:00
msg "[Critique] Une erreur inattendue s'est produite."
2021-08-06 22:55:09 +02:00
else
2022-05-24 12:38:02 +02:00
msg " ${ PURPLE } [Critique] Une erreur inattendue s'est produite. ${ NOFORMAT } "
2021-08-06 22:55:09 +02:00
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..."
2022-05-24 12:38:02 +02:00
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
2021-08-06 22:55:09 +02:00
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
; ;
2022-05-24 12:38:02 +02:00
-?*) die " Option inconnue : $1 " ; ;
2021-08-06 22:55:09 +02:00
*) break ; ;
esac
shift
done
input_files = ( " $@ " )
}
# vérifie les logiciels prérequis
check_deb_pkg( ) {
2021-08-07 00:19:18 +02:00
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 } "
2021-08-06 22:55:09 +02:00
required_pkg = ''
for pkg in " $@ " ; do
dpkg -s $pkg & >/dev/null || required_pkg = " $required_pkg $pkg "
done
2021-08-07 00:19:18 +02:00
[ [ -z $required_pkg ] ] || die " ${ RED } Erreur : Ce script requiert certains logiciels pour fonctionner. Exécutez la commande suivante pour le/les installer :
2021-08-06 22:55:09 +02:00
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
2022-05-24 12:38:02 +02:00
fi
2021-08-06 22:55:09 +02:00
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
2021-08-07 00:19:18 +02:00
msg " ${ GREEN } Début du traitement du fichier ' $ifile '. ${ NOFORMAT } "
2021-08-06 22:55:09 +02:00
inputfile_dir = $( dirname " $ifile " )
tmp_dir = $( mktemp --directory --tmpdir= " $inputfile_dir " .watermark_remover_XXXXXXXXXX)
2021-08-07 00:19:18 +02:00
inputfile_wo_ext = $( echo " $ifile " | rev | cut -d. -f2- | rev)
2021-08-06 22:55:09 +02:00
tmpfiles_prefix = $tmp_dir /$( basename " $inputfile_wo_ext " )
msg "Réécriture du document PDF dans un nouveau fichier (ça peut prendre beaucoup de temps)..."
2021-08-07 00:19:18 +02:00
gs -dNOPAUSE -dBATCH -dSAFER -sDEVICE= pdfwrite -dPDFSETTINGS= /$pdf_quality -dAutoRotatePages= /None -dCompatibilityLevel= 1.7 -sOutputFile= " ${ tmpfiles_prefix } _1.pdf " " $ifile " & >>$log_file
2021-08-06 22:55:09 +02:00
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
2022-05-24 12:38:02 +02:00
sed -ri '/^\(.+\\n.+\\r.+\)Tj$/d' " ${ tmpfiles_prefix } _2.pdf " & >>$log_file
2021-08-06 22:55:09 +02:00
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 :
2022-05-24 12:38:02 +02:00
# - 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é