PDF-Wasserzeichen mit Ghostscript automatisieren
Fügen Sie jeder Seite einer PDF die diagonale Beschriftung CONFIDENTIAL hinzu,
auch bei unterschiedlichen Seitengrößen und Drehungen. Das folgende Skript schreibt eine Kopie mit
Wasserzeichen und eine separate komprimierte Variante zur Prüfung in ein neues Verzeichnis. Es
bewahrt die Eingabedatei und ersetzt keine früheren Ergebnisse.
Nutzen Sie dies für eine Kopie zum Teilen, deren Darstellung Sie prüfen können. Ghostscript schreibt die PDF neu: Digitale Signaturen werden ungültig, und Formulare, Anmerkungen, Barrierefreiheits-Tags und Farben können sich ändern. Die Beschriftung ist deckend hellgrau. Prüfen Sie daher, dass sie keine wichtigen Inhalte verdeckt. Ein sichtbares Wasserzeichen verschlüsselt das Dokument nicht und verhindert kein Kopieren.
Ghostscript installieren und konfigurieren
Sie benötigen Bash, gs von Ghostscript,
pdfinfo und pdftoppm von Poppler sowie einen PDF-Viewer.
Installieren Sie unter Ubuntu oder Debian gepflegte Pakete:
sudo apt-get update && sudo apt-get install ghostscript poppler-utils
Prüfen Sie diese separat installierten Werkzeuge, bevor Sie die Beispieldateien speichern:
bash --version && gs --version && pdfinfo -v && pdftoppm -v
Die Befehle wurden unter Ubuntu 24.04 mit Bash 5.2, Ghostscript 10.02.1 und Poppler 24.02.0 getestet sowie unter Linux mit Bash 5.3, Ghostscript 10.07.1 und 10.08.0 sowie Poppler 26.08.0. Dies sind getestete Versionen, keine grundsätzlich erforderlichen Mindestversionen. Verwenden Sie gepflegte Pakete Ihrer Distribution oder von der Ghostscript-Release-Seite und prüfen Sie die Ergebnisse nach einem Upgrade. Diese Anleitung behandelt keine native Ausführung unter Windows oder macOS.
Arbeiten Sie in einem Verzeichnis, das Ihre Quelldatei als input.pdf enthält.
Speichern Sie beide folgenden Dateien im selben Verzeichnis. Das Skript sucht nach
watermark.ps in dem Verzeichnis, in dem Sie es ausführen.
Wasserzeichen mit einer EndPage-Prozedur erstellen
Speichern Sie dies als watermark.ps. EndPage zeichnet die
Beschriftung nach dem vorhandenen Seiteninhalt. Bei der Deaktivierung des Ausgabegeräts gibt die
Prozedur false zurück, damit dieses Ereignis keine zusätzliche Seite ausgibt:
%!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 setzt den Grafikzustand der Seite zurück, bevor die Beschriftung
positioniert wird. Die Glyphengrenzen zentrieren sie auf beiden Achsen. Die Skalierungsberechnung
lässt auf schmalen Seiten Platz für die vollständige gedrehte Beschriftung. Achten Sie darauf, dass
diese PostScript-Datei vertrauenswürdig bleibt: Sie ist ausführbarer Code. Fügen Sie keine
Benutzereingaben ohne entsprechende Maskierung in die Beschriftung ein.
Skript zur PDF-Automatisierung speichern
Speichern Sie dies als process.sh. Es lädt die Wasserzeichenprozedur vor der
Quell-PDF und übergibt anschließend die tatsächlich erzeugte Ausgabe mit Wasserzeichen an die
Komprimierungsstufe:
#!/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 verwendet den sichtbaren beschnittenen Bereich der PDF als
Ausgabeseite, statt die Beschriftung auf einer größeren, ausgeblendeten Seitenfläche zu zentrieren.
Dadurch bleiben die angezeigte Größe und Ausrichtung erhalten, während die Seitenrahmen und
möglicherweise die Drehungsmetadaten normalisiert werden. Verwenden Sie einen anderen Ablauf, wenn
Sie die größere ursprüngliche Seitenfläche benötigen. Siehe die
CropBox-Option von Ghostscript.
-dAutoRotatePages=/None folgt auf jede Voreinstellung, um die textbasierte
Ausrichtungsheuristik zu deaktivieren. Insbesondere wählt /ebook sonst
/All, was Seiten drehen kann, wenn der überwiegende Text seitwärts verläuft.
Die Tabelle der Voreinstellungen
und die Optionen zur Ausrichtung
dokumentieren dieses Verhalten. Das Leeren von GS_OPTIONS bei jedem Aufruf
verhindert, dass übernommene Optionen wie eine feste Papiergröße oder Seitenauswahl die Ausgabe
dieses Beispiels verändern.
Wasserzeichen sicher anwenden
Führen Sie das gespeicherte Skript in Bash aus:
bash process.sh input.pdf new-results
Ein erfolgreicher Durchlauf erstellt new-results/stamped.pdf und
new-results/compressed.pdf. Die erste Datei ist die Kopie mit Wasserzeichen, die zweite eine
komprimierte Variante zur Prüfung mit derselben Beschriftung. Das Ausgabeverzeichnis muss neu sein.
Wählen Sie für eine Wiederholung einen anderen Verzeichnisnamen und behalten Sie frühere Ergebnisse
zum Vergleich.
Wenn ein Konvertierungsbefehl fehlschlägt, entfernt das Skript seine beiden Ausgabedateien und sein neu erstelltes Verzeichnis. Die Quelldatei und ein bereits vorhandenes Ergebnisverzeichnis bleiben unangetastet. Beheben Sie das gemeldete Problem und führen Sie denselben Befehl erneut aus. Bei fehlenden Werkzeugen, fehlenden Dateien oder einer nicht lesbaren PDF wird der Vorgang abgelehnt, bevor das Verzeichnis erstellt wird.
pdfinfo prüft, ob Poppler die Eingabedatei öffnen kann, und
-dPDFSTOPONERROR stoppt Ghostscript bei PDF-Fehlern anstelle der üblichen
Fehlerbehebung. Keines von beiden ist eine vollständige PDF-Validierung. Eine erfolgreiche
Konvertierung beweist nicht, dass eine beschädigte Quelldatei korrekt rekonstruiert wurde. Lesen
Sie Warnungen und prüfen Sie die Ausgabe. Halten Sie Ghostscript mit Sicherheitsupdates aktuell
und -dSAFER aktiviert. Die
Dateizugriffskontrollen
ersetzen bei nicht vertrauenswürdigen Dokumenten keine Sandbox des Betriebssystems.
PDF-Komprimierung optimieren
Verwenden Sie stamped.pdf, wenn Sie die komprimierte Variante zur Prüfung nicht
benötigen. /ebook legt für Farb- und Graustufenbilder eine Zielauflösung von
150 dpi zur Auflösungsreduzierung fest, abhängig von einem Auflösungsschwellenwert. Es ändert auch
weitere Einstellungen. /prepress, das in der ersten Stufe verwendet wird,
garantiert keine unveränderte Qualität. Keine der beiden Voreinstellungen garantiert eine kleinere
Datei.
Vergleichen Sie die tatsächlichen Bytezahlen:
wc -c input.pdf new-results/stamped.pdf new-results/compressed.pdf
Rendern Sie die Quelldatei und beide Ausgaben mit Poppler anhand ihrer sichtbaren CropBox-Bereiche. Führen Sie den gesamten Block einschließlich der Klammern aus, damit ein fehlgeschlagener Befehl diesen Block stoppt, ohne Ihre Shell zu verändern:
(
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
)
Öffnen Sie die entsprechenden PNGs nebeneinander. Prüfen Sie auf jeder Seite Ausrichtung,
Abmessungen, Text und Bilder der Quelldatei sowie eine vollständige, zentrierte diagonale Beschriftung.
Öffnen Sie die PDFs auch in Ihrem Viewer mit dem vorgesehenen Zoom oder in der vorgesehenen
Druckgröße. Der Vorschaublock lehnt ein bereits vorhandenes Verzeichnis
previews ab. Behalten Sie es oder benennen Sie es um, bevor Sie einen weiteren
Satz Vorschaubilder erstellen.
Wählen Sie die komprimierte Variante nur, wenn ihre Größe und Darstellung zu Ihrem Dokument passen. Mehr zum Vergleich von Voreinstellungen und zur Prüfung von PDF-Funktionen erfahren Sie unter PDF-Optimierung mit der Ghostscript-CLI.
