Für das Abbilden von PDFs als Bilder auf einer Webpage und zum Sicherstellen, dass der Ursprung der PDFs bzw. der Bilder ersichtlich bleibt auch wenn die Bilder mal kopiert werden, habe ich nach einer Lösung gesucht, die automatisch PDFs in Bilder konvertiert und Wasserzeichen anbringt. Dieser Artikel beschreibt das Vorgehen.
Grundlagen
Der folgende Artikel beschreibt das automatisierte Bearbeiten von PDFs und Konvertierung in PNGs mithilfe von ImageMagick. Als Basis dient die aktuelle Version 7 von ImageMagick. Weiter benutze ich Linux als Plattform - auf anderen können die Kommando’s etwas anders aussehen.
Das Vorgehen sieht in etwa wie folgt aus:
- Konvertieren des PDFs nach PNG
- Entfernen des transparenten Bereichs rund um den Inhalt des PDFs
- Bilder zusammenhängen (vertikal)
- Wassermarke erstellen
- Wassermarke auf das bestehende Bild legen
Die jeweiligen Schritte werden in den folgenden Abschnitten beschrieben.
Konvertieren des PDFs nach PNG
Das Konvertieren von PDF in ein Grafik-Format mittels ImageMagick ist einfach:
convert -density 150 Quelldatei.pdf -quality 100 Zieldatei.png
Dabei gibt der Parameter -density
die gewünschte “Pixeldichte” des Zielbildes an (hier 150
dpi). Mit dem Parameter -quality
wird definiert, wie hoch die Qualität in Prozent für das Zielbild sein soll. Mit 100
definiert dass keine Kompression zum Einsatz kommt - mit Werten unter 100 wird das Bild entsprechend komprimiert.
Bei mehrseitigen PDFs werden mit diesem Kommando mehrere Ausgabe-Bilder erstellt. Ohne weiteren Parameter hängt ImageMagick an die Datei einen Zähler. Die resultierenden Dateien für das obige Beispiel bei einem zweiseitigen PDF würde dann Zieldatei-0.png
und Zieldatei-1.png
lauten.
Entfernen des transparenten Bereichs rund um den Inhalt des PDFs
Die oben aufgeführte Konvertierung führt dazu, dass der umgebende Rand ebenfalls als Grafik konvertiert wird - allerdings typischerweise transparent. Wollen wir im Anschluss die konvertierten Grafiken aneinander hängen, ergeben sich “unschöne” Abstände zwischen den Inhalten. Kann gewünscht sein - in meinem Fall aber nicht. Daher kommt folgende Zeile zum entfernen der transparenten Teile zum Einsatz:
mogrify -trim +repage Zieldatei.png
Hier ist der Parameter -trim
der Schlüssel - damit wird der transparente Teil quasi entfernt.
Bilder zusammenhängen (vertikal)
Der nächste Schritt besteht darin, die einzelnen Grafiken zusammen zu hängen (untereinander). Dies erreichen wir mit dem folgenden Kommando:
convert Zieldatei-*.png -background transparent -gravity South -append Zieldatei.png
Der Parameter -background
definiert den gewünschten Hintergrund beim Zusammenfügen der Bilder. In diesem konkreten Fall ist er Transparent.
Wassermarke erstellen
Für mich ist die Unabhängigkeit von weiteren Dateien wichtig - insbesondere der Verzicht auf ein Wasserzeichen in Form einer dedizierten Grafik. Falls man eine dedizierte Grafik nutzen möchte, kann diesen Schritt überspringen.
convert -size 200x100 -background None -font Palatino-Roman -fill 'lightblue' label:https://blog.sekureco42.ch +clone -channel RGB -negate +channel -repage -2-2 -layers merge -channel A -evaluate Multiply 0.15 +channel -trim +repage -rotate 15 watermark.png
Hier die wichtigsten Punkte:
-size 200x100
: Definiert die Grösse des Wasserzeichen-font Palatino-Roman
: Definiert den zu benutzenden Zeichensatz. Mittels convert -list font kann man sich die Liste der vorhandenen Zeichensätze auflisten lassen.-fill 'lightblue'
: Gibt die zu verwendende Farbe für den Text des Wasserzeichens an.label:https://blog.sekureco42.ch
definiert den Text für das Wasserzeichen.-evaluate Multiply 0.15
: Damit wird das Wasserzeichen über den Alpha-Kanal (-channel A) auf 0.15 gesetzt (Teil-Transparent).-rotate 15
: Damit wird der Text um 15° gedreht.watermark.png
: Dateiname für das Wasserzeichen.
Wassermarke auf das bestehende Bild legen
Der letzte Schritt besteht darin, das Wasserzeichen auf das zuvor generierte Bild zu legen. Dies geschieht wie folgt:
composite -tile -gravity center watermark.png Zielbild.png Zielbild-wm.png
Mittels -tile
wird angegeben, dass man das Wasserzeichen mehrfach auf dem Zielbild haben möchte. Der Parameter -gravity center
definiert die Positionierung.
Das resultierende Skript
#!/bin/bash
# Script to convert PDF to PNG
FILE=$1
FILE_NOEXT=${FILE%.*}
if [ -z "$FILE" ]; then
echo "ERROR: Please specify an PDF document!"
exit 1
fi
if [ -f "$FILE_NOEXT.png" ]; then
echo "INFO: Found already generated image - deleting it."
rm -f "$FILE_NOEXT.png"
fi
if [ -f "$FILE_NOEXT-wm.png" ]; then
echo "INFO: Found already generated image with watermark - deleting it."
rm -f "$FILE_NOEXT-wm.png"
fi
# First we have to create seperate PNG from each PDF page
convert -density 150 $FILE -quality 100 $FILE_NOEXT.png
# Trim each PNG (remove border)
mogrify -trim +repage $FILE_NOEXT*.png
# Stitch all PNG images to one large image
convert $FILE_NOEXT*.png -background transparent -gravity South -append $FILE_NOEXT.png
# Cleanup intermediate PNG files
rm -f $FILE_NOEXT-*.png
# Create Watermark
convert -size 200x100 -background None -font Palatino-Roman -fill 'lightblue' label:https://e-mobility.icer.ch +clone -channel RGB -negate +channel -repage -2-2 -layers merge -channel A -evaluate Multiply 0.15 +channel -trim +repage -rotate 15 watermark.png
# Overlay destination image with watermark images
composite -tile -gravity center watermark.png $FILE_NOEXT.png $FILE_NOEXT-wm.png
Das Skript wird dann typischerweise so aufgerufen:
./makePNGfromPDF.sh Quelldatei.pdf
Das Ergebnis sind folgende Dateien:
watermark.png
- Das Wasserzeichen als Datei.Quelldatei.png
- PDF nach PNG konvertiert ohne Wasserzeichen.Quelldatei-wm.png
- PDF nach PNG konvertiert mit Wasserzeichen.