Compressez vos PDF en 2 clics sous Ubuntu
Posté le 30. Juin 2024 • 4 minutes • 803 mots • Autres langues: English
Dans ma famille, il y a plusieurs PC sous Linux/Ubuntu. J’ai eu besoin de rendre accessible facilement la compression de PDF sur l’un d’entre eux. En effet, il est courant de devoir déposer des documents sur des plateformes en ligne, et la taille des documents est souvent limitée. Habitué pour ma part à la ligne de commande, je voulais là une fonction utilisable par n’importe qui.
Plutôt que de rechercher un énième logiciel de traitement PDF, je me suis attelé à rechercher un “script” que je pourrais intégrer à Nautilus, le gestionnaire de fichier par défaut dans Ubuntu (Gnome). Et bonne nouvelle, j’en ai trouvé un que je vous présente !
Les scripts du gestionnaire de fichiers Nautilus
Les “scripts” Nautilus sont de petits programmes que les utilisateur·rice·s peuvent ajouter au gestionnaire de fichiers pour automatiser ou faciliter des tâches répétitives sur des documents.
Ces scripts sont ensuite facilement accessibles, via le menu contextuel (clic droit) des fichiers et dossiers.
Pour utiliser un script Nautilus, il suffit de placer votre script dans le répertoire ~/.local/share/nautilus/scripts
et de lui appliquer le droit d’exécution chmod +x
. Les scripts peuvent être écrits en divers langages de programmation comme Bash, Python… Une fois le script ajouté, il devient accessible via le menu contextuel “Scripts” dans Nautilus.
Lorsqu’un script est exécuté, il reçoit des paramètres, tels que les fichiers ou dossiers sélectionnés, et peut effectuer des actions spécifiques en fonction de ces entrées. Par exemple, un script peut redimensionner des images, renommer des fichiers en lot, ou convertir des formats de fichiers. Ici, nous allons compresser des PDF.
Le script de compression PDF
Je crée mon fichier ~/.local/share/nautilus/scripts/CompressPDF
et je lui ajoute l’exécution avec chmod +x
.
ATTENTION : Le script utilisé a des dépendances pour la compression notamment, veuillez installer : sudo apt install ghostscript
NOTE : Il est possible de sélectionner plusieurs fichiers pour compresser un lot entier 🤩
Script de compression :
#!/bin/bash
# AUTHOR: (c) Ricardo Ferreira
# NAME: Compress PDF 1.4
# DESCRIPTION: A nice Nautilus script with a GUI to compress and optimize PDF files
# REQUIRES: ghostscript, poppler-utils, zenity
# LICENSE: GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# WEBSITE: https://launchpad.net/compress-pdf
# Messages
# English (en-US)
error_nofiles="No file selected."
error_noquality="No optimization level selected."
error_ghostscript="PDF Compress requires the ghostscript package, which is not installed. Please install it and try again."
error_nopdf="The selected file is not a valid PDF archive."
label_filename="Save PDF as..."
label_level="Please choose an optimization level below."
optimization_level="Optimization Level"
level_default="Default"
level_screen="Screen-view only"
level_low="Low Quality"
level_high="High Quality"
level_color="High Quality (Color Preserving)"
job_done="has been successfully compressed"
filename_postpend="-optimized"
case $LANG in
fr*)
# French (fr-FR) by Astromb
error_nofiles="Aucun fichier sélectionné"
error_noquality="Aucun niveau d'optimisation sélectionné"
error_ghostscript="PDF Compress a besoin du paquet ghostscript, mais il n'est pas installé. Merci de l'installer et d'essayer à nouveau."
error_nopdf="Le fichier que vous avez sélectionné n'est pas un PDF valide."
label_filename="Sauvegarder le PDF sous..."
label_level="Merci de choisir, ci-dessous, un niveau d'optimisation."
optimization_level="Niveau d'optimisation"
level_default="Défaut"
level_screen="Affichage à l'écran"
level_low="Basse qualité"
level_high="Haute qualité"
level_color="Haute qualité (Couleurs préservées)"
filename_postpend="-optimisé";;
esac
VERSION="1.4.1"
ZENITY=$(which zenity)
# Check if Ghostscript is installed
GS="/usr/bin/ghostscript"
if [ ! -x $GS ]; then
$ZENITY --error --title="Compress PDF "$VERSION"" --text="$error_ghostscript"
exit 0;
fi
# Check if the user has selected any files
if [ $# -eq 0 ]; then
$ZENITY --error --title="Compress PDF "$VERSION"" --text="$error_nofiles"
exit 0;
fi
# Ask the user to select a compressing format
selected_level=$($ZENITY --list --title="Compress PDF "$VERSION"" --text "$label_level" --radiolist --column "" --column "$optimization_level" TRUE "$level_default" FALSE "$level_screen" FALSE "$level_low" FALSE "$level_high" FALSE "$level_color")
if [ -z "$selected_level" ]; then
$ZENITY --error --title="Compress PDF "$VERSION"" --text="$error_noquality"
exit 0;
fi
# Select the optimization level to use
case $selected_level in
"$level_default")
COMP_COMMAND="/default"
;;
"$level_screen")
COMP_COMMAND="/screen"
;;
"$level_low")
COMP_COMMAND="/ebook"
;;
"$level_high")
COMP_COMMAND="/printer"
;;
"$level_color")
COMP_COMMAND="/prepress"
;;
esac
# Choose output file name
temp_filename=.temp-mytmppdf.pdf
if [ $# -eq 1 ] ; then
pdf_file=$(basename "$1")
suggested_filename=${pdf_file%.*}${filename_postpend}.${pdf_file##*.}
output_filename=$($ZENITY --file-selection --save --confirm-overwrite --filename="$suggested_filename" --title="$label_filename")
if [ "$?" = 1 ] ; then
exit 0;
fi
fi
for arg in "$@"
do
if [ $# -ne 1 ] ; then
pdf_file=$(basename "$arg")
output_filename=${pdf_file%.*}${filename_postpend}.${pdf_file##*.}
fi
# Check if the selected file is a PDF
mimetype=$(file -b -i "$arg")
if [ -z "`echo $mimetype | grep -i 'pdf' `" ]; then
$ZENITY --error --title="Compress PDF "$VERSION"" --text="$error_nopdf"
exit 0;
fi
# Extract metadata from the original PDF
pdfinfo "$arg" | sed -e 's/^ *//;s/ *$//;s/ \{1,\}/ /g' -e 's/^/ \//' -e '/CreationDate/,$d' -e 's/$/)/' -e 's/: / (/' > .pdfmarks
sed -i '1s/^ /[/' .pdfmarks
sed -i '/:)$/d' .pdfmarks
echo " /DOCINFO pdfmark" >> .pdfmarks
# Execute ghostscript while showing a progress bar
(echo "0" ;
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=$COMP_COMMAND -dNOPAUSE -dQUIET -dBATCH -sOutputFile="$temp_filename" "$arg" .pdfmarks
rm .pdfmarks
echo "100") | (if `$ZENITY --progress --pulsate --auto-close --title="Compress PDF "$VERSION""`;
then
mv -f "$temp_filename" "$output_filename" &
notify-send "Compress PDF" "$pdf_file $job_done"
else
killall gs
rm "$temp_filename"
exit
fi)
done