Verwenden Sie Ghostscript, aber weisen Sie es an, Bilder nicht erneut zu verarbeiten?

30

Ich habe eine PDF-Datei mit bereits komprimierten und etwas artefaktbehafteten Bildern und stelle dieser PDF-Datei mit Ghostscript eine Titelseite voran.

Ich kann GS jedoch nicht anweisen, die vorhandenen Bilder so zu verwenden, wie sie sind, ohne sie erneut zu verarbeiten, und jetzt habe ich das Gefühl, dass es etwas mit der Funktionsweise von GS zu tun hat, dh, Sie können ein PDF nicht neu kompilieren / verknüpfen ohne seine Bilder wieder aufzubereiten. Ist das wahr?

Ich kann die DPI-Einstellung in GS erhöhen, aber es wird von 5 MB auf 60 MB gehen, während es immer noch schlechter aussieht .

Gibt es eine bessere Alternative zu GS, die das tut, was ich brauche (am besten unter OS X)?

Mahmoud Al-Qudsi
quelle
Können Sie Ihre Frage bearbeiten und die genaue Befehlszeile angeben, mit der Sie der ursprünglichen PDF-Datei die Titelseite voranstellen? Dann könnte ich Ihnen sagen, was Sie genau ändern oder zur Befehlszeile hinzufügen müssen, um eine bessere Ausgabe für Bilder zu erhalten ...
Kurt Pfeifle
Ich möchte nicht, dass es einfach besser aussieht, ich möchte ohne Wiederaufbereitung verschmelzen. Dies führt a) zu einer besseren Qualität (verlustfreie Transformationen) und b) zu keiner Verschwendung von Stunden CPU-Zeit bei der Verarbeitung meines Dokuments mit mehr als 1000 Seiten.
Mahmoud Al-Qudsi
1
Hey, Sie haben meine Frage nicht beantwortet und nicht die genaue GS-Befehlszeile angegeben, die Sie verwenden. Was bedeutet: Sie werden nicht die Hilfe in Bezug auf GS bekommen, die Sie suchen ...
Kurt Pfeifle

Antworten:

44

Wenn Sie nur zwei PDF-Dateien verketten möchten, ohne den Inhalt erneut zu verarbeiten, pdftksind Sie hier richtig. (Unter Mac OS X sollte dies über MacPorts oder Fink verfügbar sein. Für Linux gibt es native Pakete für alle wichtigen Distributionen. Für Windows sehen Sie hier nach. ) Versuchen Sie Folgendes:

 pdftk title.pdf content.pdf cat output book.pdf

Dies wird die prepend title.pdf zum content.pdf und das Ergebnis in schreiben book.pdf .

pdftkist eine "blöde", aber sehr schnelle Möglichkeit, zwei (oder mehr) PDF-Dateien zu verketten. "Dumm" insofern, als pdftkes den PDF - Datenstrom in keiner Weise interpretiert , es nur dafür sorgt, dass die internen Objektnummern nach Bedarf neu gemischt werden und in der PDF - xrefStruktur (die im Grunde eine Art PDF ToC für PDF ist) erscheinen Objekte).

Ghostscript:

Wenn Sie Ghostscript verwenden möchten, lautet der grundlegende Befehl zum Verketten derselben zwei Dateien:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
   title.pdf \
   content.pdf

Wie Sie jedoch festgestellt haben, kann diese einfache Befehlszeile Ihre Bildqualität beeinträchtigen. Der Grund dafür ist, dass Ghostscript bei der Verarbeitung von PDFs nicht "dump" ist: Es interpretiert sie beim Einlesen vollständig und erstellt beim Ausschreiben des Ergebnisses eine völlig neue Datei. Für die Erstellung des Ergebnisses werden automatisch die Standardeinstellungen für viele Details in der Gesamtverarbeitung verwendet. Diese Standardeinstellungen gelten für alle Fälle, in denen die Aufrufe Ghostscript nicht anders angewiesen hatten.

Die Methode von Ghostscript zum Erstellen des neuen Buches.pdf ist also viel "intelligenter" (aber auch viel langsamer) als die Methode von Ghostscript pdftk. (Dies ist auch der Grund, warum Ghostscript in vielen Fällen in der Lage ist, b0rken PDF-Dateien in Grenzen zu "reparieren" oder Schriftarten in die Ausgabe-PDFs einzubetten, die nicht in Eingabe-PDFs eingebettet sind, oder doppelte Bilder zu entfernen und zu ersetzen sie durch bloße Verweise usw. - und insgesamt kleinere, besser optimierte Dateien aus aufgeblähten Eingabe-PDFs erstellt ...)

Die Lösung besteht darin, Ghostscript die Standardeinstellungen nicht zu überlassen: indem der Befehlszeile weitere benutzerdefinierte Parameter hinzugefügt werden.

Was bedeutet "Ghostscript 'interpretiert' seine PDF-Eingabe" ?

Alle Dateien und deren Inhalte (Objekte, Streams, Schriftarten, Bilder, ...) werden eingelesen, geprüft und in einer eigenen internen Darstellung gehalten, bevor die resultierende PDF-Datei mit ihren PDF-Objekten erneut ausgespuckt wird. Beim Ausspucken wendet Ghostscript jedoch alle internen Standardeinstellungen für die Hunderte von verfügbaren Parametern [*] an .

Leider führt dies zu einer "erneuten Verarbeitung" von Bildern gemäß diesen Standardeinstellungen - die nur durch Hinzufügen eigener (gewünschter) Befehlszeilenparameter vermieden oder überschrieben werden kann.

Ihre Bildprobleme können durch die Notwendigkeit von Ghostscript (aufgrund von Lizenzproblemen) verursacht werden, JPEG2000-Bilder in JPEG-Codierungen umzucodieren. Wenn Sie dies vermeiden möchten, fügen Sie Ihrer Befehlszeile Folgendes hinzu:

-dAutoFilterColorImages=false \
-dAutoFilterGrayImages=false \
-dColorImageFilter=/FlateEncode \
-dGrayImageFilter=/FlateEncode \

Weitere bildbezogene Befehlszeilenoptionen, die berücksichtigt werden sollten, sind:

-dColorConversionStrategy=/LeaveColorUnchanged \
-dDownsampleMonoImages=false \
-dDownsampleGrayImages=false \
-dDownsampleColorImages=false \

Die vollständige Ghostscript-Befehlszeile, die Sie glücklich machen könnte, sollte also lauten:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dDownsampleMonoImages=false \
  -dDownsampleGrayImages=false \
  -dDownsampleColorImages=false \
  -dAutoFilterColorImages=false \
  -dAutoFilterGrayImages=false \
  -dColorImageFilter=/FlateEncode \
  -dGrayImageFilter=/FlateEncode \
   title.pdf \
   content.pdf

Sie können Ghostscript auch anweisen, Bilder in der Ausgabe-PDF-Datei NICHT zu komprimieren , indem Sie die folgende Befehlszeile verwenden:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dEncodeColorImages=false \
  -dEncodeGrayImages=false \
  -dEncodeMonoImages=false \
   title.pdf \
   content.pdf

.


[*]:
Wenn Sie sich über eine vollständige Liste der Standardeinstellungen informieren möchten , die das pdfwrite- Gerät von Ghostscript verwendet , führen Sie den folgenden Befehl aus. Es gibt Ihnen die vollständige Liste zurück:

 gs \
   -sDEVICE=pdfwrite \
   -o /dev/null \
   -c "currentpagedevice { exch ==only ( ) print == } forall"

Erläuterungen dazu, was genau diese Parameter bedeuten, finden Sie in der Adobe-Dokumentation zu "Distiller-Parameter" . Ghostscript ist sehr bemüht, all diese ...

Kurt Pfeifle
quelle
3
(FYI) In meinem Fall die Fahnen dEncodeColorImages, dEncodeGrayImages, dEncodeMonoImagesUrsache der Ausgabedatei viel massiveren zu werden. Durch das Entfernen wurde die Dateigröße von 22 MB auf 3,1 MB geändert, und die Bildqualität scheint genau so zu sein, wie bei Verwendung dieser Flags. Alle die einzigartigen Flaggen mit I Gebrauch ist: dColorConversionStrategy=/LeaveColorUnchanged, dDownsampleMonoImages=false, dDownsampleGrayImages=false, dDownsampleColorImages=false, dAutoFilterColorImages=false, dAutoFilterGrayImages=false, dColorImageFilter=/FlateEncode,dGrayImageFilter=/FlateEncode
Dor
@ Kurt Pfeifle Welche Optionen sind erlaubt -dColorImageFilter? Ich kann nur FlateEncodeund finden DCTEncode. DCT scheint JPEG zu machen (warum haben sie das verschlüsselt?). Ich denke, FLATE ist mittlerweile eine veraltete Option für Bilder, da das Patent von Bell Labs für das LZW kein Thema mehr ist. Nach einiger Zeit der Suche kann ich jedoch nicht herausfinden, wie PNG (oder etwas anderes) verwendet werden kann. Meine Originalbilder sind PNG und ich möchte, dass sie unverändert bleiben. Ich habe die Option -c ausprobiert, aber es gibt mir -c can only be used in a built with POSTSCRIPT included....
Louis Somers