ajout de la version initiale du script
This commit is contained in:
parent
6eb25a2285
commit
86227c46ba
183
waterwark_remover.sh
Normal file
183
waterwark_remover.sh
Normal file
@ -0,0 +1,183 @@
|
||||
#!/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
|
Loading…
x
Reference in New Issue
Block a user