Raven - Blog
30. Juin 2024

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.

Nautilus script

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

Nautilus script NOTE : Il est possible de sélectionner plusieurs fichiers pour compresser un lot entier 🤩

Nautilus script

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
Follow me

Subscribe to my RSS feed !