184 lines
6.2 KiB
Bash
184 lines
6.2 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
set -Eeuo pipefail
|
|
trap unexpected_error SIGINT SIGTERM ERR
|
|
|
|
usage() {
|
|
cat <<EOF
|
|
Usage: ./$(basename "${BASH_SOURCE[0]}") [-h] [-v] [-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)
|
|
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
|