Skaliert

Ghostscript taugt nicht nur zum Konvertieren von PostScript in Rasterformate. Kreativ benutzt, lassen sich damit PDFs skalieren und deren Inhalte modifizieren.

vorlesen Druckansicht 4 Kommentare lesen
Lesezeit: 5 Min.
Von
  • Kurt Pfeifle
Inhaltsverzeichnis

Der Wunsch eines Kollegen: „Hier ist ein PDF mit sehr breiten Rändern. Die hätte ich gerne beschnitten, damit ich auf meinem iPad beim Lesen weniger zoomen muss.“

Über -c “[PostScript-Schnipsel]“ kann man Ghostscript den Auftrag für Manipulationen erteilen. So skaliert -c “<</Install {.5 .5 scale}>> setpagedevice“ horizontal und vertikal auf die jeweils halben Werte. Das bewahrt das ursprüngliche Seitenverhältnis. -c “<</Install {.75 .666 scale}>> setpagedevice“ verkleinert hingegen horizontal auf 75 %, vertikal auf 66,6 %, was eine leichte Verzerrung bewirkt.

Um von A5 auf A4 oder von A4 auf A3 zu skalieren, benötigt man auf 141,5 % vergrößerte Seitenlängen. In umgekehrter Richtung klappt es mit 70,7 %:

A5 -> A4 oder A4 -> A3: {1.415 1.415 scale}
A3 -> A4 oder A4 -> A5: { .707 .707 scale}

Mit den geeigneten Werten kann man damit eine „flüssige“ Wandlung zwischen A4- und Letter-Formaten bewirken:

  * A4 -> Letter: {1.028571   .940617 scale}
* Letter -> A4: { .972222 1.063131 scale}

Mit diesen Parametern ändern sich ausschließlich die Seiten-Inhalte. Die Mediengröße bleibt, wie sie ist. Folglich rutschen beim Verkleinern Inhalte nach links unten, beim Vergrößern ragen sie über die rechte obere Ecke hinaus:

gs -o ausgabe-A5.pdf \
-sDEVICE=pdfwrite \
-c "<</Install {.5 .5 scale}>> setpagedevice" \
-f eingabe-A4.pdf

Zusätzlich ist also das Anpassen der Mediengröße gefragt. Am schnellsten klappt dies bei PDFs mit dem Parameter -g (in Pixeln). Dafür gelten folgende Werte:

A5:     -g5950x4210 (Querformat)
A5: -g4210x5950 (Hochformat)
A4: -g5950x8420 (Hochformat)
Letter: -g6120x7920 (Hochformat)

Das vollständige Kommando zum „flüssigen“ Anpassen einer Letter-PDF-Datei im Hochformat auf A4 lautet also (unter Windows gswin32c.exe statt gs):

gs -o ausgabe-A4.pdf \
-sDEVICE=pdfwrite \
-g5950x8420 \
-c "<</Install{.972222 1.063131 scale}>> setpagedevice" \
-f eingabe-letter.pdf

Manchmal möchte man nach einer Skalierung zusätzlich weiße Ränder beseitigen oder verkleinern. Zum Berechnen der Parameter könnte man vorhandene Randmaße schätzen oder mit dem Geodreieck vermessen. Hier kann Ghostscript ebenfalls helfen: Per -sDEVICE=bbox berechnet es die BoundingBox jeder Seite, jenes Rechteck, das beim Druck tatsächlich Toner oder Tinte abbekommt. gs -q -dBATCH -dNOPAUSE -sDEVICE=bbox input.pdf liefert die x- und y-Koordinaten der linken unteren und rechten oberen Ecken.

Die Koordinaten gibt es jeweils doppelt: als gerundete Ganzzahlen sowie auf sechs Nachkommastellen genau. Die Einheiten sind pt, PostScript-Punkte, wobei gilt: 72 pt = 720 Pixel = 1 Zoll = 25,4 mm. Die ganzzahlige Genauigkeit genügt für den nächsten Schritt, daher kann man die Ausgabe per 2>&1 | grep "%%BoundingBox" filtern. Windows-Benutzer ersetzen grep durch findstr. Ghostscript gibt die BoundingBox-Information nicht im stdout- sondern im stderr-Kanal des Terminals aus. 2>&1 führt beide Kanäle bei stdout zusammen, damit grep funktioniert.

Zum Ermitteln der BoundingBox muss Ghostscript den PDF-Code jeder einzelnen Seite virtuell rendern, denn die Informationen stecken nicht in Metadaten, die es nur auszulesen gilt. Das benötigt Zeit. Auch können in einem Dokument je PDF-A4-Seite durchaus unterschiedliche BoundingBoxen vorkommen, wie folgendes Ausgabe-Beispiel verdeutlicht:

%%BoundingBox: 36 34 525 811
%%BoundingBox: 71 32 559 812
%%BoundingBox: 34 34 525 801

Damit man nicht zu radikal abschneidet und wertvollen Inhalt ausradiert, gilt es, den größten gemeinsamen Nenner zu finden. Die Minimalwerte der beiden ersten Spalten, in Kombination mit den Maxima der dritten und der vierten, ergeben die „Meta“-Box 34 32 559 812.

Für die Aufgabenstellung wären also abzuschneiden: vom linken Rand 34 pt, vom unteren 32 pt, vom rechten 36 pt (595 559) sowie vom oberen 30 pt (842 minus 812). Vom A4-Maß 595 x 842 (in pt) bleibt somit die Zielgröße 525 x 780 übrig. Da sich bestehender Inhalt (mitsamt Rändern) per Default immer in die linke untere Ecke einpasst, muss man ihn jetzt noch verschieben: 34 pt nach links und 32 pt nach unten – per {-34 -32 translate}:

gs -o ausgabe-A4-rand-beschnitten.pdf \
-sDEVICE=pdfwrite \
-g5250x7800 \
-c "<</Install{1 1 scale -34 -32 translate}>> setpagedevice" \
-f eingabe-A4-rand-vorhanden.pdf

NatĂĽrlich geht es auch umgekehrt:

gs -o mit-mehrraendern.pdf \
-sDEVICE=pdfwrite \
-g6670x9500 \
-c "<</Install{1 1 scale 18 36 translate}>> setpagedevice" \
-f eingabe-A4.pdf

fügt links 18 pt (1/4 Zoll), unten 36, rechts 54 und oben 72 hinzu, setzt die Seitengröße auf insgesamt -g6670x9500 Pixel und verschiebt die Inhalte um entsprechende Werte nach rechts und oben.

Bei manchen PDFs kann es passieren, dass diese Operation keine sichtbare Auswirkung hinterlässt. Schuld daran ist eine interne Definition im PDF-Code der Eingangsdatei, die einen CropBox-Wert setzt. Diese optionale Festlegung definiert, welchen Teilbereich der Seiten ein PDF-Viewer anzeigen oder ein Drucker drucken soll. Wie man diese Klippe umschifft, wird demnächst ein weiterer Tools-und-Tipps-Artikel erklären.

ist Freelancer und Spezialist für alle Themen rund ums Drucken und setzt dabei – zwar nicht ausschließlich, aber am liebsten – freie Software ein. (avr)