Verwenden Sie Ghostscript, aber lassen Sie es nicht zu, Bilder erneut zu verarbeiten.

12407
Mahmoud Al-Qudsi

Ich habe ein PDF, das bereits komprimierte und etwas artefaktartige Bilder enthält, und ich benutze Ghostscript, um diesem PDF eine Titelseite voranzustellen.

Ich finde jedoch keine Möglichkeit, GS mitzuteilen, die vorhandenen Bilder einfach so zu verwenden, wie sie ist, ohne sie erneut aufzubereiten, 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 wiederaufzubereiten .. Ist das wahr?

Ich kann die DPI-Einstellung in GS erhöhen, aber sie wird von 5MB auf 60MB gehen und dabei noch schlechter aussehen.

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

23
Können Sie Ihre Frage bearbeiten und die genaue Befehlszeile angeben, die Sie verwenden, um Ihre Titelseite der ursprünglichen PDF-Datei voranzustellen? Dann könnte ich Ihnen sagen, was genau Sie ändern oder zur Befehlszeile hinzufügen müssen, um eine bessere Ausgabe für Bilder zu erhalten ... Kurt Pfeifle vor 12 Jahren 0
Ich möchte nicht, dass es besser aussieht, ich möchte ohne Wiederaufbereitung zusammenführen. Dies führt a) zu einer besseren Qualität (verlustfreie Transformationen) und b) Vergeuden Sie keine Stunden an CPU-Zeit, wenn Sie mein 1000-seitiges Dokument verarbeiten. Mahmoud Al-Qudsi vor 12 Jahren 0
Sie haben meine Frage nicht beantwortet und nicht die genaue GS-Befehlszeile angegeben, die Sie verwenden. Was bedeutet: Sie erhalten keine Hilfe in Bezug auf GS, nach der Sie suchen ... Kurt Pfeifle vor 12 Jahren 1

1 Antwort auf die Frage

37
Kurt Pfeifle

Wenn Sie nur zwei PDF-Dateien ohne erneute Aufbereitung ihres Inhalts verketten möchten, pdftkist dies für Sie. (Unter Mac OS X sollte dies über MacPorts oder Fink verfügbar sein. Für Linux gibt es native Pakete für alle großen Distributionen; für Windows, siehe hier. ) Versuchen Sie Folgendes:

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

Dadurch wird title.pdf vor content.pdf gestellt und das Ergebnis in book.pdf geschrieben .

pdftkist eine "dumme", aber sehr schnelle Möglichkeit, zwei (oder mehr) PDF-Dateien zu verketten. „Dumb“ in so weit, wie pdftkin keiner Art und Weise interpretieren die PDF - Datenstrom, es macht Sie sicher, dass die internen Objektnummern werden wieder neu gemischt je nach Bedarf und erscheinen in der PDF - xrefStruktur (die im Grunde eine Art von PDF ist ToC für Objekte).

Ghostscript:

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

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

Wie Sie jedoch erfahren haben, kann diese einfache Befehlszeile Ihre Bildqualität beeinträchtigen. Der Grund ist, dass Ghostscript bei der Verarbeitung von PDF- Dateien nicht "Dump" ist: Es interpretiert sie beim Einlesen vollständig und erstellt beim Schreiben des Ergebnisses eine komplett neue Datei. Zum Erstellen des Ergebnisses werden automatisch Standardeinstellungen für viele Details in der Gesamtverarbeitung verwendet. Diese Standardeinstellungen gelten für alle Fälle, in denen die Aufrufe von Ghostscript nicht anderweitig angewiesen wurden.

Daher ist die Methode von Ghostscript zur Erstellung des neuen book.pdf viel "intelligenter" (aber auch viel langsamer) als pdftkdie Methode von "". (Dies ist auch der Grund, warum Ghostscript in vielen Fällen in der Lage ist, PDF-Dateien innerhalb von Grenzen zu "reparieren" oder Schriftarten in die Ausgabe-PDFs einzubetten, die nicht in PDF-Eingabedateien eingebettet sind, oder doppelte Bilder zu entfernen und zu ersetzen diese durch bloße Referenzen usw. - und generell kleinere, besser optimierte Dateien aus aufgeblähten PDF-Eingabedateien ...)

Die Lösung besteht darin, Ghostscript nicht mit seinen Standardeinstellungen arbeiten zu lassen: indem Sie der Befehlszeile weitere benutzerdefinierte Parameter hinzufügen.

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

Alle Dateien und deren Inhalte (Objekte, Ströme, Schriftarten, Bilder usw.) 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 seine internen Standardeinstellungen für die Hunderte von Parametern [*] an, die verfügbar sind.

Leider führt dies zu einer "Wiederaufbereitung" von Bildern gemäß diesen Standardeinstellungen, die nur durch Hinzufügen eigener (gewünschter) Befehlszeilenparameter vermieden oder überschrieben werden können.

Ihre Bildprobleme könnten von Ghostscript verursacht werden (aufgrund von Lizenzproblemen), JPEG2000-Bilder in JPEG-Kodierung umzuwandeln. Wenn Sie dies vermeiden möchten, fügen Sie der 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 daher wie folgt 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 überhaupt NICHT zu komprimieren, indem Sie diese Befehlszeile verwenden:

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

.


[*]:
Wenn Sie an einer vollständigen Liste der Standardeinstellungen interessiert sind, die Ghostscripts pdfwrite- Gerät verwendet, führen Sie den folgenden Befehl aus. Sie erhalten die vollständige Liste:

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

Um zu erklären, was genau all diese Parameter bedeuten, müssen Sie sich in der Adobe-Dokumentation über "Distiller-Parameter" informieren . Ghostscript ist sehr bemüht, all diese ...

hervorragende Antwort! matt wilkie vor 11 Jahren 7
Das ist Gold genau hier! Vincent vor 9 Jahren 5
(FYI) In meinem Fall bewirken die Flags `dEncodeColorImages`,` dEncodeGrayImages`, `dEncodeMonoImages`, dass die Ausgabedatei wesentlich massiver wird. Durch das Entfernen der Dateien wurde die Dateigröße von 22 MB auf 3,1 MB geändert und die Bildqualität scheint genau wie bei der Verwendung dieser Flags. Alle die * einzigartigen * Flags, die ich benutze, sind '47 ' = / FlateEncode`, `dGrayImageFilter = / FlateEncode` Dor vor 7 Jahren 2