Viele Unix-Programme zum Verändern von PDF-Dokumenten beherrschen jeweils nur eine spezielle Operation. Um mehrere Dokumente nacheinander in gleicher Art und Weise zu bearbeiten, helfen neben dem gezielten Studium der Handbücher und der Dokumentation auch Programmierkenntnisse, etwas Experimentierfreude und Geduld. Als Werkzeuge benötigen Sie das PDF Toolkit PDFrecycle [1], PDFtk [2], PDFjam [3] sowie Awk und Sed [4] für kleinere Bash-Skripte.
Florian Diesch hat 2009 angefangen PDFrecycle zu entwickeln. Das Python-basierte Konsolenwerkzeug baut auf dem PyPDF-Modul [5] und in Folge auf dem Textsatzsystem LaTeX auf. Bisher steht das Programm nur als Tar-Archiv über EasyInstall [6] bereit. Das macht eine Installation per Hand und insbesondere am Paketmanagement vorbei notwendig.
Neben Python benötigt die Software die Pakete python-pypdf und python-setuptools [7] erforderlich. Distributionsspezifische Pakete für Debian/Ubuntu oder Fedora liegen derzeit nicht vor. PDFrecycle steht als Software im Alpha-Stadium. Das bisherige Ergebnis schaut aber recht viel versprechend aus.
Dieschs Idee besteht darin, die einzelnen Transformationen für die PDF-Dokumente nicht als Parameter in der Kommandozeile zu übergeben, sondern stattdessen in einer Textdatei abzulegen. Diese Textdatei übergeben Sie beim Aufruf an die Software, und diese arbeite sie entsprechend ab.
pdfrecycle -i transformat↩ionen -o basename
Die Steuerdatei enthält einzelne Anweisungen, Statements genannt, mit denen Sie die Transformationen und deren Abfolge bestimmen. Um das Ausgabefile wunschgemäß zu benennen, geben Sie den Namensstamm über -o basename
an. Das Suffix pdf ergänzt das Programm automatisch. Die folgenden Beispiele demonstrieren den Einsatz der Software sowie der oben genannten Werkzeuge.
Rotation
Für eine Drehung mit PDFrecycle benötigen Sie die Steuerdatei, in der Sie die Anweisungen ablegen. Den Namen der Datei dürfen Sie frei wählen. Um die Seiten 1 bis 4 des PDF-Dokuments flyer.pdf um 180 Grad zu drehen, schreiben Sie folgende Anweisungen in die Textdatei:
FILE flyer.pdf ANGLE 180 PAGE 1-4
Anstandslos führt PDFrecycle den Auftrag aus, selbst bei krummen Winkeln. Mit den Seitenzahlen stellt es sich jedoch etwas pingelig an: Falls die Seiten im genannten Dokument nicht existieren, wirft es hemmungslos mit Fehlermeldungen um sich und verweigert trotzig die Arbeit.
Möchten Sie nur Teile des Dokuments in 90-Grad-Schritten drehen, helfen Ihnen die Kommandos PDF90, PDF180 und PDF270 aus dem PDFjam-Paket. Diese rotieren Seiten um die angegebene Gradzahl im Uhrzeigersinn. Für obigen Fall sieht der Aufruf wie folgt aus:
pdf180 --outfile flyer-gedreht.p↩ df flyer.pdf 1-4
Um gleich einen ganzen Stapel PDF-Dokumente zu bearbeiten, akzeptiert PDFrecycle eine Folge von Kommandos in der Textdatei – für jedes PDF-Dokument separat. Es packt jedoch das Ergebnis aller Transformationen in eine einzige Ausgabedatei. Es bleibt daher nur als Ausweg, jedes PDF-Dokument innerhalb einer Schleife einzeln (Listing 1).
Listing 1
for filename in file1.pdf file2.pdf file3.pdf;
do
desc=$(basename $filename .pdf);
pdfrecycle -i "$desc.trans" -o "$desc-res"
done
Grundlage bildet eine Liste von PDF-Dokumenten, in Zeile 1 der Einfachheit halber als file1.pdf bis file3.pdf benannt. Zu jedem PDF-Dokument gehört eine Steuerdatei mit den Transformationsbefehlen, hier benannt file1.trans für file1.pdf. Für jedes File aus der Liste bestimmt das Skript zuerst den Namesstamm ohne Suffix (Zeile 3) und speichert diesen in der Variable $desc ab. Danach folgt der Aufruf von PDFrecycle in Zeile 4 mit dem Transformationsfile (Option -i) und dem Namen des Ausgabefiles (Option -o).
Jedes Vorkommen der Variable $desc ersetzt die Bash beim Verarbeiten der Kommandozeile durch den Variableninhalt – hier durch den zuvor gespeicherten Filenamen ohne Erweiterung. Nach dem Ausführen des Skripts liegen im Dateisystem drei neue PDF-Dokumente, benannt file1-res.pdf, file2-res.pdf und file3-res.pdf.
Mit den Werkzeugen PDF90, PDF180 und PDF270 geht das weitaus unkomplizierter. Mit der Option --suffix übergeben Sie die Erweiterung, die Sie an den Namen des gedrehten Files anfügen möchten. Durch die Option --batch und eine nachfolgende Dateiliste wissen die Tools, welche PDF-Dokumente sie drehen möchten:
pdf90 --suffix 'gedreht' --batch↩ file1.pdf file2.pdf
Seiten entfernen
Erstellen Sie zum Beispiel Dokumente wie Rechnungen mit PDFlatex, dann kommt es beim Einsatz von Tabellen manchmal vor, dass diese durch die unterschiedlichen Zeilenzahlen manchmal etwas größer als der maximal mögliche Seiteninhalt ausfallen. Der automatischen Seitenumbruch von LaTeX verschiebt dann die Tabelle im Dokument auf die nachfolgende Seite.
Im Ergebnis entsteht ein Dokument aus mehreren Seiten, bei dem die Seite vor der Tabelle eventuell leer ist. Das ärgert und erfordert das Löschen der leeren Seite. Das erledigen Sie zum Beispiel mittels PDFtk über folgenden Aufruf:
pdftk inputfile.pdf cat 2-end ou↩ tput outputfile.pdf
Um das Problem des Umbruchs zu vermeiden, wäre es natürlich möglich, die Randeinstellungen im LaTeX-Dokument zu verändern. Falls das nicht geht, zum Beispiel wegen einem fest vorgegebenen Layout, bleibt nur obiger Aufruf oder ein intelligentes Shell-Skript, das Ihnen die Arbeit erleichtert.
Nachfolgende Kombination aus den zwei Shell-Skripten pdfpages.sh (Listing 2) und pdfcompact.sh (Listing 3) nimmt Ihnen die Arbeit ab. Das erste ermittelt zunächst die Anzahl der Seiten im PDF-Dokument, und das zweite entfernt danach zielsicher die unerwünschte Seite.
Das Ermitteln der Seitenanzahl erfolgt im Skript pdfpages.sh durch den Aufruf von PDFinfo. Das liefert die Seitenanzahl des Dokuments (Zeile 12). Aus dem Ergebnis schneidet Egrep genau die Textzeile heraus, die die Zeichenkombination "Pages:" beinhaltet. Mit dem Standardwerkzeug Awk [8] zerlegen Sie diese Zeile danach in zwei Felder. Als Trennzeichen fungiert dabei der Doppelpunkt, was Sie Awk über die Option -F: mitteilen.
Das zweite Feld beinhaltet die Seitenanzahl und landet mit ' { print $2 } ' auf der Standardausgabe. Der Streameditor (Sed) liest diese über eine Pipe wieder ein und löscht daraus alle vorkommenden Leerzeichen – oder genauer: ersetzt alle Leerzeichen durch nichts.
Dabei kommt eine Musterersetzung durch einen Regulären Ausdruck zum Einsatz. Ausführlichen Lesestoff dazu bietet Jeffrey Friedls exzellentes Buch zum Thema reguläre Ausdrücke. In Zeile 13 gibt das Skript die ermittelte Seitenanzahl aus. Um das Skript zu testen (Abbildung 1), genügt der Aufruf:
./pdfpages.sh test.pdf
Listing 2
#!/bin/bash
pdffile=$1
if [[ -z $pdffile ]]
then
# ups - keine Parameter?
echo "Kein PDF-File angegeben."
echo "Aufruf: pdfpages PDF-file"
exit 1
fi
pdfpages=`pdfinfo $1 | egrep '^Pages:' | awk -F: ' { print $2 } ' | sed -e 's/ //g'`
echo "Anzahl Seiten: $pdfpages"
exit 0
Listing 3
#!/bin/bash
inputfile=$1
outputfile=$2
updateOriginal=0
if [[ -z $inputfile ]]
then
# keine Parameter angegeben?
echo "Zu bearbeitendes PDF-File fehlt."
echo "Aufruf: pdfcompact.sh input.pdf [output.pdf]"
exit 1
fi
if [[ -z $outputfile ]]
then
outputfile="$1.tmp"
updateOriginal=1
fi
pdfpages=`./pdfpages.sh $1 | awk -F: ' { print $2 } ' | sed -e 's/ //g'`
if [[ $pdfpages -gt "1" ]]
then
# erste Seite (Leerseite) aus dem PDF löschen
# und in angegebenem Ausgabefile speichern
pdftk $1 cat 2-end output $outputfile
fi
if [[ updateOriginal -eq 1 ]]
then
# kein Ausgabefile benannt - daher Original modifizieren (umbenennen)
mv $outputfile $1
fi
Nachdem pdfcompact.sh die angegebenen Parameter geprüft hat, ruft es in Zeile 21 unser Skript aus Listing 2 auf. Dieses ermittelt die Seitenanzahl und das Ergebnis landet über eine Pipe bei Awk und Sed. Diese extrahieren die Ziffern aus dem Text. Falls das Auswerten in Zeile 22 ergibt, dass das PDF-Dokument einen Umfang von mehr als einer Seite hat, schneidet das Skript mit PDFtk die erste Seite heraus (Zeile 26 in Listing 3). Der Aufruf des Skripts erfolgt mit diesem Kommando:
./pdfcompact.sh in.pdf out.pdf
Haben Sie ein Ausgabedokument angegeben, bleibt die Eingabedatei unverändert. Falls Sie kein Ausgabefile benennen, modifiziert das Skript die Eingabedatei wunschgemäß.
Das Skript hat jedoch eine wichtige Einschränkung. Es erkennt nicht, ob die erste Seite tatsächlich leer ist. Möglich wäre ein Erkennen mit Hilfe der beiden Werkzeuge PDFtotext und PDFimages. Diese Werkzeuge extrahieren Text und Bilddaten aus PDF-Dokumenten. Liefern beide für die erste Seite keinen Inhalt zurück, ist die Wahrscheinlichkeit recht hoch, dass die Seite tatsächlich leer ist.



