webentwicklung-frage-antwort-db.com.de

Ändern der Größe eines PDF mit Ghostscript

Ich versuche, ein PDF zu skalieren, das zum Beispiel nur klein von A4 bis A4 ist.

Dies funktioniert gut mit Porträtdokumenten. Das Dokument wird korrekt skaliert und dann oben aufgefüllt.

Bei Querformatdokumenten wird jedoch kein Auffüllen hinzugefügt. Daher hat das Dokument am Ende die richtige Höhe für A4, ist dann aber nicht breit genug, da auf der Dokumentseite keine Polsterung hinzugefügt wird (wie ich gehofft habe).

Dies ist, was ich benutze, um es für A4-Hochformatdokumente arbeiten zu lassen:

gs \
 -sOutputFile=output.pdf \
 -sDEVICE=pdfwrite \
 -sPAPERSIZE=a4 \
 -dCompatibilityLevel=1.4 \
 -dNOPAUSE \
 -dBATCH \
 -dPDFFitPage \
  input.pdf
37
Matt

Sie sollten das -dFIXEDMEDIA Schalter:

gs \
 -o output.pdf \
 -sDEVICE=pdfwrite \
 -sPAPERSIZE=a4 \
 -dFIXEDMEDIA \
 -dPDFFitPage \
 -dCompatibilityLevel=1.4 \
  input.pdf

-dFIXEDMEDIA ist immer erforderlich, wenn Sie eine bestimmte Papier-/Seiten-/Mediengröße erzwingen und die im Dokument angegebene Papier-/Seiten-/Mediengröße ignorieren müssen. Denn PDF hat immer eine definierte Papier-/Seiten-/Mediengröße (PostScript hat möglicherweise ... oder nicht ...).

(Mein -o ... ist kürzer und erspart das Hinzufügen von -dBATCH -dNOPAUSE - funktioniert aber nur für neuere Versionen von Ghostscript.)

52
Kurt Pfeifle

Zunächst einmal vielen Dank für alle, die hier gepostet haben.

Ich habe dieses kleine Skript mit dem Namen pdfScale , das Teile der hier geposteten Antworten aufnimmt. Also habe ich beschlossen, meine 2 Cent zurückzubuchen. Ich benutze eine Mischung aus Kurts und Tims Antworten. Ähnlich wie bei Tim. Ich habe ein paar Tage damit gespielt und hier ist meine teilweise Schlussfolgerung zu den hier geposteten Methoden:

Mit -sPAPERSIZE Das Papierformat nach Namen einstellen

  • Einfach, den Papiernamen zu übergeben (zB a4)
  • Die Punktgröße ist möglicherweise nicht 100% genau
  • Kann Querformat <> Hochformat spiegeln

Papiergröße in PS-Punkten einstellen -dDEVICEWIDTHPOINTS, -dDEVICEHEIGHTPOINTS

  • Stellt sicher, dass Sie die gewünschte Größe in Punkten erhalten
  • Sie können WIDTH <> HEIGHT selbst spiegeln
  • Sie müssen die Größen in Punkten kennen
  • Die Skripterstellung ist nicht so einfach, da Sie die neue Seitengröße in Punkten und die Seitengröße der Quelle benötigen, wenn Sie Quer-/Hochformat erkennen möchten.
  • Sie können auch benutzerdefinierte Papiere festlegen (jede gewünschte Größe).
  • Ich habe -dDEVICEWIDTH, -dDEVICEHEIGHT Anstelle der längeren Punkteversion verwendet, aber beide scheinen dasselbe zu tun (beide bekommen Punkte).

Da mein Bash-Skript bereits Quell-Seitengrößen ermitteln kann und mir die Idee gefiel, benutzerdefinierte Seitengrößen festlegen zu können, habe ich mich darauf konzentriert, die Seitengröße in Punkten festzulegen. Ich hatte auch schon das GS Paper Sizes in mein Skript aufgenommen (mit Namen und Größen). Also war es auch einfach, diese Informationen zu bekommen.

Wie bereits erwähnt, ist die Verwendung von -dFIXEDMEDIA In beiden Fällen ein Muss.

So lief mein Ansatz (in einer skriptbasierten Weise)

  1. Quelle abrufen PDF Seitengrößen (für die Flip-Erkennung)
  2. Ermittelt die Seitengröße des Ziels in Punkten (zB A4> 595x842)
  3. Überprüfen Sie, ob sie die gleiche Ausrichtung haben, oder spiegeln Sie das Ziel, falls erforderlich
  4. Führen Sie GS mit Punkten oder gespiegelten Punkten aus

Als ich versuchte, das Problem mit der automatischen Drehung zu beheben, ich fand diese andere Kurt-Antwort . Hier geht es um die Verwendung von -dAutoRotatePages. Kopieren Sie einfach einen Teil seiner Antwort hier:

  • -dAutoRotatePages=/None - behält die Ausrichtung jeder Seite bei;
  • -dAutoRotatePages=/All - dreht alle Seiten (oder keine) abhängig von einer Art "Mehrheitsentscheidung";
  • -dAutoRotatePages=/PageByPage - Dreht Seiten automatisch einzeln.

Mein Skript ist standardmäßig PageByPage, aber das ist einstellbar. Bei meinen Tests hat es gut funktioniert. Die Verwendung von -dAutoRotatePages Scheint auch die Notwendigkeit des Vorblätterns der Seitengröße zu verringern, auch wenn dies nicht dasselbe ist. Ich habe beide Optionen beibehalten.

Meine kleine App wurde ursprünglich erstellt, um PDFs zu skalieren (ohne die Seitengröße zu ändern). Dann habe ich jetzt die Funktionalität hinzugefügt, um das eine, das andere oder beides zu tun. Ich konnte immer noch nicht alles mit einem einzigen GS-Anruf erledigen.

Dies ist, was ich für die Größenänderung fordere, die Variablen in reale Werte ändern. Dies ist für A4-Hochformat mit PageByPage automatischer Drehung:

gs \
-q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dSAFER \
-dCompatibilityLevel="1.5" -dPDFSETTINGS="/printer" \
-dColorConversionStrategy=/LeaveColorUnchanged \
-dSubsetFonts=true -dEmbedAllFonts=true \
-dDEVICEWIDTHPOINTS=595 -dDEVICEHEIGHTPOINTS=842 \
-dAutoRotatePages='/PageByPage' \
-dFIXEDMEDIA -dPDFFitPage \
-sOutputFile='../myOutputFile.pdf' \
-f '../input.pdf'

Bitte beachten Sie, dass ich auch -dFIXEDMEDIA UND -dPDFFitPage Verwende. Da dies zur Seite passt, kann der andere Teil meines Skripts nützlich sein, um den Inhalt innerhalb von PDF nach der Größenänderung zu skalieren (insbesondere, wenn sich der Anteil von PDF stark geändert hat). . Und das ist einer der Gründe, warum ich die Skalierung immer nach der Größenänderung in meinem Skript (im gemischten Modus) ausführe.

Was die Bruchprobleme bei der Verwendung des Papiernamens angeht, passierte mir das, bevor ich die Umrechnungen von mm/Zoll auf Punkte rundete. Nachdem ich angefangen habe, sie abzurunden, scheinen sie immer die benötigten zu sein. Scheint seltsam, dass GS diese Werte jedoch unterschreitet.

Mein Fazit ist also, dass es schwierig ist, eine Lösung zu finden, die für verschiedene Dokumente mit unterschiedlichen Größen und Ausrichtungen geeignet ist. Ich bin mir immer noch nicht sicher, ob ich die richtige Lösung verwende. Ich hoffe jedoch, dass der Benutzer die Flip Detection und GS Auto-Rotation ändern kann, um zumindest für die meisten Fälle eine Lösung zu finden.

Ich habe auch den größten Teil des Codes in dem Prozess neu erstellt und es ist jetzt ziemlich einfach zu lesen. Es kann nützlich sein, dies zu überprüfen, wenn Sie eine solche Aufgabe selbst automatisieren möchten. Natürlich ist es auch nützlich, PDFs nur zu skalieren/zu skalieren:

https://github.com/tavinus/pdfScale

PS: pdfScale hat seine Ursprünge in diesem StackOverflow-Thread .

8
Gus Neves

Ihr Befehl führt überhaupt keine Skalierung durch, sondern nimmt nur eine PDF Datei und konvertiert sie in eine PDF Datei.

Ich würde vorschlagen, dass Sie -dPDFFitPage hinzufügen, wodurch die Seite in der PDF Datei entsprechend der aktuellen Seitengröße skaliert wird (wie in diesem Fall von -sPAPERSIZE angegeben).

Dies ist normalerweise für Drucker gedacht, die eine definierte Papiergröße haben, und funktioniert daher möglicherweise nicht gut mit dem pdfwrite-Gerät, das keine feste Seitengröße hat, es ist jedoch ein Versuch.

7
KenS

Es scheint, dass die Größe der Ausgabe (am besten) erzwungen werden kann, indem die Größe in Punkten angegeben und -dPDFFitPage nicht verwendet wird. Ich bekam gebrochene Punktgrößen, was schlecht war. Das Folgende gilt für den A5-Druck mit einem Print-on-Demand-Dienst. "Real" A5 ist 420x595 Punkte. Ich fand heraus, dass die Verwendung von -sPAPERSIZE = a5 Bruchpunktseitengrößen ergab, aber dies könnte daran liegen, dass das Original wackelig war.

gs \
 -o output.pdf \
 -sDEVICE=pdfwrite \
 -dDEVICEWIDTHPOINTS=419 -dDEVICEHEIGHTPOINTS=595 \
 -dFIXEDMEDIA \
 -dCompatibilityLevel=1.4 \
  input.pdf

Um dies zu testen, stellte ich fest, dass ich mit PDFshuffler einzelne Seiten exportieren und dann mit pdfinfo die genaue Größe dieser Seiten ermitteln konnte. Dies bestätigte, dass die Verwendung von Geräteparametern ausdrücklich hilfreich war.

6
Tim B