Stapelverarbeitung von PDFs unter Linux – Bash-Skripte und Tools
Linux ist die ideale Plattform für die automatisierte Verarbeitung großer Mengen von PDF-Dateien. Mit Bash-Skripten und leistungsstarken Kommandozeilenwerkzeugen wie pdftk, Ghostscript, Tesseract und ocrmypdf können Sie hunderte oder tausende PDFs automatisch komprimieren, zusammenfügen, teilen, mit OCR versehen oder konvertieren – alles ohne manuellen Eingriff. Dieser Artikel zeigt Ihnen, wie Sie effektive Stapelverarbeitungs-Workflows für PDFs unter Linux aufbauen, welche Tools sich für welche Aufgaben eignen und wie Sie typische Probleme lösen. Ob als Cron-Job, als Teil einer CI/CD-Pipeline oder als einmaliges Skript für einen großen Digitalisierungsauftrag – diese Techniken helfen Ihnen, Zeit zu sparen und Fehler zu reduzieren.
Grundlegendes Bash-Skript für PDF-Stapelverarbeitung
Ein einfaches Bash-Skript ist der Einstieg in die PDF-Stapelverarbeitung. Das folgende Skript komprimiert alle PDFs in einem Verzeichnis und speichert die komprimierten Versionen in einem Unterordner: mkdir -p ausgabe; for f in *.pdf; do echo "Verarbeite: $f"; gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -sColorConversionStrategy=RGB -sOutputFile=ausgabe/$f $f; done; echo 'Fertig!'. Wichtig: Verwenden Sie immer -sColorConversionStrategy=RGB statt LeaveColorUnchanged, um Probleme mit ICC-Farbprofilen zu vermeiden.
- 1Ausgabeordner erstellen: mkdir -p komprimiert
- 2Alle PDFs komprimieren: for f in *.pdf; do gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -sColorConversionStrategy=RGB -sOutputFile=komprimiert/$f $f; done
- 3Alle PDFs zusammenfügen: pdfunite *.pdf zusammengefuegt.pdf
- 4Batch-OCR mit ocrmypdf: for f in *.pdf; do ocrmypdf -l deu $f ocr/$f; done
- 5Parallel ausführen: find . -name '*.pdf' | parallel -j$(nproc) gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -sOutputFile=ausgabe/{/} {}
Fortgeschrittene Techniken: Filtering und Logging
Für produktive Umgebungen sollten Stapelverarbeitungs-Skripte Fehlerbehandlung und Logging enthalten. Ein robusteres Skript prüft, ob die Ausgabedatei kleiner als die Eingabe ist, und behält andernfalls das Original: for f in *.pdf; do OUTPUT=ausgabe/$f; gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -sColorConversionStrategy=RGB -sOutputFile=$OUTPUT $f; if [ $(wc -c < $OUTPUT) -ge $(wc -c < $f) ]; then cp $f $OUTPUT; echo "Kein Gewinn für $f, Original behalten."; fi; done. Schreiben Sie alle Aktionen in eine Log-Datei: Zeile >> verarbeitungs.log für spätere Auswertung.
Cron-Jobs für automatische PDF-Verarbeitung
Wenn Sie regelmäßig neue PDFs verarbeiten müssen – zum Beispiel täglich eingehende gescannte Dokumente –, eignet sich ein Cron-Job hervorragend. Richten Sie einen Cron-Job ein mit: crontab -e. Fügen Sie eine Zeile hinzu: 0 2 * * * /usr/local/bin/pdf-batch.sh >> /var/log/pdf-batch.log 2>&1. Dieser Job läuft täglich um 2:00 Uhr morgens. Das Skript pdf-batch.sh sollte das Eingabeverzeichnis überwachen, neue Dateien verarbeiten und verarbeitete Dateien in ein Archiv verschieben. Mit inotifywait können Sie auch auf neue Dateien reagieren, ohne auf einen Cron-Job warten zu müssen: inotifywait -m /pfad/zu/eingang -e create | while read dir action file; do ocrmypdf /pfad/zu/eingang/$file /pfad/zu/ausgabe/$file; done.
Parallelverarbeitung für maximale Geschwindigkeit
Moderne Linux-Server und Workstations haben viele CPU-Kerne, die bei der sequentiellen PDF-Verarbeitung oft ungenutzt bleiben. GNU Parallel ermöglicht einfache Parallelverarbeitung: parallel -j$(nproc) 'gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -sColorConversionStrategy=RGB -sOutputFile=ausgabe/{/} {}' ::: *.pdf. $(nproc) gibt die Anzahl der verfügbaren CPU-Kerne zurück, sodass automatisch optimal parallelisiert wird. Auf einem 8-Kern-System können so 8 PDFs gleichzeitig verarbeitet werden, was die Gesamtzeit auf ein Achtel reduziert. Installation: sudo apt install parallel. Fuer die langfristige Wartung von PDF-Stapelverarbeitungs-Skripten empfiehlt sich die Versionsverwaltung mit Git. Speichern Sie alle Skripte in einem Git-Repository, dokumentieren Sie Aenderungen mit aussagekraeftigen Commit-Nachrichten und verwenden Sie Tags fuer stabile Versionen. Wenn Sie Skripte auf mehreren Servern einsetzen, kann ein zentrales Git-Repository als Single Source of Truth dienen. Mit Ansible oder Puppet koennen Sie die Skripte und ihre Abhaengigkeiten auf allen Servern konsistent verwalten. Fuer kritische Produktions-Workflows empfiehlt sich ausserdem ein Smoke-Test: Verarbeiten Sie nach jedem Deployment ein Test-PDF und pruefen Sie, ob das Ergebnis den Erwartungen entspricht. Damit stellen Sie sicher, dass Updates keine unerwarteten Regressionen eingefuehrt haben. Fuer produktive Linux-Server-Umgebungen ist die Fehlerbehandlung in Batch-Skripten entscheidend. Verwenden Sie set -e am Anfang Ihres Bash-Skripts, damit es bei Fehlern sofort abbricht. Mit trap koennen Sie Aufraeumaaktionen definieren, die auch bei Fehlern ausgefuehrt werden. Eine robuste Logging-Strategie hilft bei der Fehlersuche: Schreiben Sie Datum, Uhrzeit und Dateiname in eine Log-Datei fuer jede verarbeitete Datei. Mit GNU Parallel koennen Sie die Anzahl der parallelen Jobs dynamisch an die Serverlast anpassen. Fuer kritische Produktions-Workflows empfiehlt sich ausserdem ein Health-Check nach jeder Batch-Verarbeitung, der sicherstellt, dass alle Ausgabedateien gueltig und nicht leer sind. LazyPDF im Browser ist eine Alternative fuer Teams, die keine Server-Infrastruktur benoetigen oder einmalige Batch-Aufgaben erledigen moechten.
Häufig gestellte Fragen
Wie verhindere ich, dass Ghostscript Dateien verschlechtert statt verbessert?
Manchmal sind PDFs bereits gut optimiert, und Ghostscript vergrößert die Datei statt sie zu verkleinern. Prüfen Sie nach der Komprimierung die Größe bevor Sie das Original überschreiben: ORIGINAL=$(wc -c < original.pdf); KOMPRIMIERT=$(wc -c < ausgabe.pdf); if [ $KOMPRIMIERT -lt $ORIGINAL ]; then mv ausgabe.pdf original.pdf; fi. So wird das Original nur dann ersetzt, wenn die neue Datei wirklich kleiner ist.
Wie verarbeite ich PDFs in Unterordnern rekursiv?
Verwenden Sie den find-Befehl: find /pfad -name '*.pdf' -exec gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -sColorConversionStrategy=RGB -sOutputFile=ausgabe/{} {} \;. Achten Sie darauf, die Ausgabeordnerstruktur entsprechend vorzubereiten, oder verwenden Sie -execdir, um die Ausgabedatei im selben Verzeichnis wie die Eingabedatei zu erstellen.
Kann ich die Stapelverarbeitung auch für sehr große PDF-Sammlungen nutzen?
Ja, Linux-Skripte sind für die Verarbeitung großer Mengen ausgelegt. Bei sehr vielen Dateien (tausende oder mehr) sollten Sie Fortschrittsanzeigen einbauen und die Verarbeitung in Batches aufteilen. Mit dem Tool pv (pipe viewer) können Sie den Fortschritt visualisieren. Stellen Sie sicher, dass genug Festplattenplatz für Eingabe, Ausgabe und temporäre Dateien vorhanden ist.