PDF-Datei beschneiden (Python)

PDF Marken und Anschnitte Ein PDF-Dokument auf ein genaues Endformat zu beschneiden kann kompliziert sein, wenn schnelle und einfache Lösungen fehlen.

Immer wieder begegnen mir PDF-Dokumente, deren Maskenrahmen größer ist als ihr Endformat-Rahmen. Ohne professionelle Drucksoftware kann dies zu Problemen führen. Das Dokument liegt dann im falschen Format vor, da viele Anwendungen nur den Masken-Rahmen für den Ausdruck berücksichtigen. Oft befinden sich zusätzliche Schnittmarken oder Druckkontrollstreifen im Maskenrahmen, die im einfachen Büro-Umfeld wenig helfen. Durch die zusätzlichen Elemente wird das Dokument in seinen Maßen "größer" als das eigentliche Endformat und muss auf das Papierformat reduziert werden.

Problemstellung

Unerfahrene Nutzer meinen es häufig einfach zu gut und aktivieren, beispielsweise beim Export aus Adobe InDesign, alle Marken und Anschnitte. So wird aus einem klassischen DIN A4 (210 x 297 [mm]) ein Überformat mit 225 x 312 [mm] Größe. Das wirkliche Druckbild wird so um einiges kleiner und die zusätzlichen Elemente, die zur Weiterverarbeitung gedacht sind, stören - da der "Bürodrucker" selbst nur Standard DIN Formate bedient und der PDF-Viewer (nicht Acorbat Reader) mit den verschiedenen Rahmen nicht arbeiten kann.

Also ist die unkomplizierte Lösung, das vorhandene PDF-Dokument auf das gewünschte Standard-Format zu beschneiden und die Marken und Anschnitte somit aus dem Druckbild zu entfernen. Der Maskenrahmen soll auf den Endformat-Rahmen reduziert werden.

PDF Rahmen

In einem PDF-Dokument existieren verschiedene Arten von Rahmen/Boxen (von innen nach außen):

  1. ArtBox / Endformat
  2. TrimBox / Beschnittrahmen
  3. BleedBox / Anschnitt
  4. CropBox / Maskenrahmen
  5. MediaBox / globaler Rahmen

Ansicht eines PDF-Dokuemntes mit verschiednen Bereichen und Rahmen.

Software, die in der Ausgabe schlecht mit den Rahmen arbeitet oder Änderungen an der Konfiguration für die Ausgabe auf dem Drucker (nicht "Tatsächlcihe Größe"!) resultieren darin, dass anstatt des Endformat-Rahmens der Maskenrahmen ausgegeben wird.

PDF Größenangaben und Positionen

Größen und Positionen werden PDF-intern in Points [pt] angegeben. Da PDF auf PostScript basiert und alles aus Nordamerika stammt ist man hier weit entfernt vom metrischen System.

72 pt ergeben 1 Zoll (oder inch) und aus 1 inch werden 25,4 mm.

Die Rahmenpostionen werden mit vier Koorinaten angegeben [x1, y1, x2, y2], die jeweils die Start- und End-Punkte für die Rahmen in Points definieren.

In der PDF-Datei kann es dann vielleicht so aussehen:

/ArtBox[113.386 113.386 708.661 955.276]
/BleedBox[56.6929 56.6929 765.354 1011.97]
/CropBox[0.0 0.0 822.047 1068.66]
/MediaBox[0.0 0.0 822.047 1068.66]
/TrimBox[113.386 113.386 708.661 955.276]

Lösungsansatz

Es wird also ein Programm benötigt, welches PDF-Dokumente lesen, deren mögliche Rahmen auswerten und einen Beschnitt des Dokumentes vornehmen kann. Wenn keine oder unpassende Rahmen im Dokument vorhanden sind, soll eine Angabe des DIN A Formates möglich sein.

In Python existiert die handliche PDF-Bibliothek PyPDF2. Diese wird hier verwendet, um ein PDF-Dokument zu lesen und zu schreiben.

Das Script kennt verschiedene DIN Formate (A0 bis A8) und kann intern größen Angaben von [mm] in [pt] umrechnen.

Der Einfachheit halber wird bei einem manuellen Zuschnitt davon ausgegangen, dass sich das Endformat im Zentrum des Gesamtdokumentes befindet. Außerdem wird bei mehrseitigen Dokumenten die erste Seite als Maßstab für alles genommen.

Ist das gewünschte Endformat bestimmt, wird eine neue PDF-Datei erstellt, deren Zuschnitt dem Format entspricht. Ein Dokument kann von seinen Maßen her nicht größer werden als die Vorlage - nur kleiner. Die fertige Datei liegt dann im selben Ordner wie die Originaldatei.

Das Script verarbeitet drei Parameter:

  • file: PDF-Datei, die zugeschnitten werden soll
  • type: Art des Zuschnitts manuell, durch Angabe von format oder die Verwendung der TrimBox des PDF-Dokumentes
  • format: DIN Format

Soll ein Dokument auf seinen möglichen Zuschnittrahmen reduziert werden ist diese Kommando zu verwenden:

python pdfcrop.py -file /PFAD/ZUR/DATEI/Dokument.pdf -type trimbox

Wenn ein bestimmtes Format (z.B. A4) aus dem PDF-Dokument erzeugt werden soll, kann folgendes Kommando genutzt werden:

python pdfcrop.py -file /PFAD/ZUR/DATEI/Dokument.pdf -format A4

Code

Das fertige Script gibt es hier pdfcrop.py: