Automatiser le filigranage des PDF avec Ghostscript
Ajoutez une mention diagonale CONFIDENTIAL à chaque page d’un PDF, y compris
aux pages de tailles et de rotations différentes. Le script ci-dessous écrit dans un nouveau
répertoire une copie avec filigrane et une version compressée distincte à évaluer. Il préserve
le fichier d’entrée et refuse de remplacer les résultats précédents.
Utilisez cette méthode pour une copie destinée au partage dont vous pouvez examiner l’apparence. Ghostscript réécrit le PDF : les signatures numériques deviennent invalides, et les formulaires, les annotations, les balises d’accessibilité et les couleurs peuvent changer. La mention est en gris clair opaque, vérifiez donc qu’elle ne masque aucun contenu important. Un filigrane visible ne chiffre pas le document et n’empêche pas sa copie.
Installer et configurer Ghostscript
Vous avez besoin de Bash, de gs de Ghostscript, de
pdfinfo et de pdftoppm de Poppler, ainsi que d’un
lecteur PDF. Sur Ubuntu ou Debian, installez des paquets maintenus :
sudo apt-get update && sudo apt-get install ghostscript poppler-utils
Vérifiez ces outils installés séparément avant d’enregistrer les fichiers d’exemple :
bash --version && gs --version && pdfinfo -v && pdftoppm -v
Les commandes ont été testées sur Ubuntu 24.04 avec Bash 5.2, Ghostscript 10.02.1 et Poppler 24.02.0, ainsi que sur Linux avec Bash 5.3, Ghostscript 10.07.1 et 10.08.0, et Poppler 26.08.0. Il s’agit de versions testées, pas de versions minimales intrinsèquement requises. Utilisez des paquets maintenus de votre distribution ou de la page des versions de Ghostscript, et examinez les résultats après une mise à niveau. Ce guide ne couvre pas l’exécution native sous Windows ou macOS.
Travaillez dans un répertoire contenant votre fichier source sous le nom
input.pdf. Enregistrez les deux fichiers ci-dessous dans ce même répertoire ;
le script recherche watermark.ps dans le répertoire depuis lequel vous l’exécutez.
Créer un filigrane avec une procédure EndPage
Enregistrez ce fichier sous le nom watermark.ps.
EndPage dessine la mention après le contenu existant de la page. Cette
procédure renvoie false lors de la désactivation du périphérique, afin
que cet événement ne produise pas de page supplémentaire :
%!PS-Adobe-3.0
<< /EndPage {
2 eq {
pop false
} {
pop
gsave
initgraphics
12 dict begin
/size currentpagedevice /PageSize get def
/label (CONFIDENTIAL) def
/Helvetica-Bold findfont 36 scalefont setfont
newpath 0 0 moveto label true charpath pathbbox
/top exch def /right exch def /bottom exch def /left exch def
/extent right left sub top bottom sub add 0.70710678 mul def
/side size aload pop 2 copy gt { exch } if pop def
/factor side 0.8 mul extent div def
factor 1 gt { /factor 1 def } if
size 0 get 2 div size 1 get 2 div translate
45 rotate
factor dup scale
0.75 setgray
left right add -2 div bottom top add -2 div moveto
label show
end
grestore
true
} ifelse
} >> setpagedevice
initgraphics réinitialise l’état graphique de la page avant de positionner la
mention. Les limites des glyphes la centrent sur les deux axes ; le calcul de l’échelle laisse
assez de place pour la mention entière après rotation sur les pages étroites. Assurez-vous que ce
fichier PostScript reste digne de confiance : c’est du code exécutable. N’insérez pas de données
saisies par l’utilisateur sans les échapper dans la mention.
Enregistrer le script d’automatisation des PDF
Enregistrez ce fichier sous le nom process.sh. Il charge la procédure de
filigranage avant le PDF source, puis transmet le résultat effectivement filigrané à la phase
de compression :
#!/bin/bash
set -euo pipefail
if [ "$#" -ne 2 ]; then
echo "Usage: $0 <input-pdf> <new-output-directory>" >&2
exit 1
fi
INPUT_FILE=$1
OUTPUT_DIR=$2
WATERMARK_FILE=$PWD/watermark.ps
STAMPED_FILE=stamped.pdf
COMPRESSED_FILE=compressed.pdf
[[ $INPUT_FILE = /* ]] || INPUT_FILE=$PWD/$INPUT_FILE
[[ $OUTPUT_DIR = /* ]] || OUTPUT_DIR=$PWD/$OUTPUT_DIR
for tool in gs pdfinfo; do
if ! command -v "$tool" >/dev/null; then
echo "Error: Install $tool before running this script" >&2
exit 1
fi
done
if [ ! -f "$INPUT_FILE" ]; then
echo "Error: Input PDF not found" >&2
exit 1
fi
if [ ! -f "$WATERMARK_FILE" ]; then
echo "Error: watermark.ps not found in the working directory" >&2
exit 1
fi
if ! pdfinfo "$INPUT_FILE" >/dev/null; then
echo "Error: Input is not a readable PDF" >&2
exit 1
fi
if ! mkdir -m 700 -- "$OUTPUT_DIR"; then
echo "Error: Use a new output directory" >&2
exit 1
fi
cleanup() {
local status=$?
if [ "$status" -ne 0 ]; then
rm -f -- "$OUTPUT_DIR/$STAMPED_FILE" "$OUTPUT_DIR/$COMPRESSED_FILE"
rmdir -- "$OUTPUT_DIR"
fi
}
trap cleanup EXIT
cd -P -- "$OUTPUT_DIR"
OUTPUT_DIR=$PWD
process_pdf() {
local output=$1
local settings=$2
shift 2
if ! GS_OPTIONS= gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pdfwrite \
-dPDFSETTINGS="$settings" -dCompatibilityLevel=1.7 \
-dAutoRotatePages=/None -dUseCropBox -dPDFSTOPONERROR \
-sOutputFile="$output" -f "$@"; then
echo "Error: PDF processing failed" >&2
exit 1
fi
}
echo "Adding watermark…"
process_pdf "$STAMPED_FILE" /prepress "$WATERMARK_FILE" "$INPUT_FILE"
echo "Creating compression candidate…"
process_pdf "$COMPRESSED_FILE" /ebook "$OUTPUT_DIR/$STAMPED_FILE"
echo "Processing complete: $OUTPUT_DIR/$COMPRESSED_FILE"
-dUseCropBox utilise la zone visible recadrée du PDF comme page de sortie,
au lieu de centrer la mention sur un canevas plus grand et masqué. Cela préserve la taille et
l’orientation affichées, tout en normalisant les boîtes de page et, potentiellement, les
métadonnées de rotation. Utilisez un autre flux de travail si vous avez besoin du canevas plus
grand de la page d’origine. Consultez l’option CropBox de Ghostscript.
-dAutoRotatePages=/None suit chaque préréglage pour désactiver son heuristique d’orientation
fondée sur le texte. En particulier, /ebook sélectionne sinon
/All, ce qui peut faire pivoter les pages lorsque leur texte dominant
est orienté latéralement. Le tableau des préréglages
et les contrôles d’orientation
documentent ce comportement. Vider GS_OPTIONS à chaque invocation empêche
les options héritées, telles qu’un format de papier fixe ou une sélection de pages, de modifier
le résultat de cet exemple.
Appliquer le filigrane de manière sécurisée
Exécutez le script enregistré dans Bash :
bash process.sh input.pdf new-results
Une exécution réussie crée new-results/stamped.pdf et new-results/compressed.pdf.
Le premier fichier est la copie avec filigrane ; le second est une version compressée à évaluer
contenant la même mention. Le répertoire de sortie doit être nouveau. Pour répéter l’opération,
choisissez un autre nom de répertoire et conservez les résultats précédents pour les comparer.
Si une commande de conversion échoue, le script supprime ses deux fichiers de sortie et le répertoire qu’il vient de créer. Il laisse intacts le fichier source et tout répertoire de résultats préexistant. Corrigez le problème signalé, puis relancez la même commande. Les outils manquants, les fichiers manquants et les PDF illisibles sont détectés et entraînent un refus avant la création du répertoire.
pdfinfo vérifie que Poppler peut ouvrir le fichier d’entrée, et
-dPDFSTOPONERROR arrête Ghostscript en cas d’erreurs PDF au lieu de sa récupération
habituelle. Aucun des deux n’est un validateur PDF complet ; une conversion réussie ne prouve pas
qu’une source endommagée a été correctement reconstruite. Lisez les avertissements et examinez
le résultat. Maintenez Ghostscript à jour avec les correctifs et gardez
-dSAFER activé. Ses contrôles d’accès aux fichiers
ne remplacent pas un bac à sable du système d’exploitation pour les documents non fiables.
Optimiser la compression des PDF
Utilisez stamped.pdf si vous n’avez pas besoin de la version compressée à
évaluer. /ebook définit une cible de sous-échantillonnage de 150 dpi pour
les images en couleur et en niveaux de gris, sous réserve d’un seuil de résolution ; il modifie
aussi d’autres paramètres. /prepress, utilisé pour la première phase, ne
garantit pas une qualité inchangée. Aucun des deux préréglages ne garantit un fichier plus petit.
Comparez les tailles réelles en octets :
wc -c input.pdf new-results/stamped.pdf new-results/compressed.pdf
Effectuez le rendu de la source et des deux fichiers de sortie avec Poppler, en utilisant leurs zones CropBox visibles. Exécutez le bloc entier, parenthèses comprises, afin qu’une commande en échec arrête ce bloc sans modifier votre shell :
(
set -eu
mkdir new-results/previews
pdftoppm -cropbox -r 150 -png input.pdf new-results/previews/original
pdftoppm -cropbox -r 150 -png new-results/stamped.pdf new-results/previews/stamped
pdftoppm -cropbox -r 150 -png new-results/compressed.pdf new-results/previews/compressed
)
Ouvrez les PNG correspondants côte à côte. Vérifiez l’orientation, les dimensions, le texte et les
images d’origine de chaque page, ainsi que la présence d’une seule mention diagonale complète et
centrée. Ouvrez aussi les PDF dans votre lecteur au niveau de zoom ou à la taille d’impression
prévus. Le bloc d’aperçu refuse un répertoire previews existant ; conservez-le
ou renommez-le avant de créer un autre ensemble.
Choisissez la version compressée à évaluer uniquement si sa taille et son apparence conviennent à votre document. Pour en savoir plus sur la comparaison des préréglages et la vérification des fonctionnalités des PDF, consultez Optimiser les PDF avec la CLI de Ghostscript.
