Befehlszeilen-PDF-Bildkomprimierungsoptimierer

Es muss nicht unbedingt CMD sein, aber ich würde es bevorzugen. Es muss allerdings kostenlos sein.

Ich habe viele verschiedene ausprobiert, aber alle scheinen einige Bitdaten in den PDFs zu optimieren und berühren nicht einmal die Bildkomprimierung, die ich anstrebe, da dies der Hauptgrund für die Größe meiner aus Google Docs generierten PDFs ist.

"Ich habe viele verschiedene ausprobiert". Welche?

Antworten (1)

Ich bin mir nicht sicher, was Sie genau mit "Komprimierungsoptimierer" meinen:

  1. Möglicherweise möchten Sie jedes einzelne PDF-Objekt, das für die gerenderten Seiten relevant sein könnte, "wie es ist" belassen und nur die höchstmögliche verlustfreie Komprimierung auf Objektströme anwenden, die noch nicht komprimiert sind oder die mit einem nicht komprimierten/codierten so effizientes Komprimierungsverfahren.

  2. Möglicherweise sind Sie bereit, zusätzlich zu den unter "1." aufgeführten Optionen einige andere Änderungen an der PDF-Datei zu akzeptieren:

    • Downsampling der Bildauflösung.
    • Subsetting von Schriftarten, die vollständig eingebettet sind.
    • Einbettung vollständig eingebetteter Schriftarten entfernen, wenn sie zu den Base 14 PDF-Schriftarten gehören.
    • Konvertieren Sie CMYK-Farben in RGB-Farben.
    • Konvertieren Sie Farbbilder in Graustufenbilder.
    • Entfernen Sie die meisten Metadaten der PDF-Datei.
    • Werfen Sie unbenutzte Gegenstände weg.
    • Wenn die endgültige Version des PDF-Dokuments das Ergebnis von inkrementellen Aktualisierungen ist, reduzieren Sie es auf diese endgültige Version (wobei alle „innerhalb erhaltenen“ früheren Versionen verworfen werden).
    • Verwerfen Sie alle potenziell eingebetteten ICC-Profile.

Eine ausreichend ausgeklügelte, lange Ghostscript-Befehlszeile kann dabei helfen. Es wird eine PDF-zu-PDF-Konvertierung durchgeführt:

gs                                         \
  -o smaller-downsampled+gray.pdf          \
  -sDEVICE=pdfwrite                        \
  -dCompressPages=true                     \
  -dCompressFonts=true                     \
  -dDownsampleColorImages=true             \
  -dDownsampleGrayImages=true              \
  -dDownsampleMonoImages=true              \
  -dColorImageResolution=72                \
  -dGrayImageResolution=72                 \
  -dMonoImageResolution=72                 \
  -dColorImageDownsampleThreshold=1.0      \
  -dGrayImageDownsampleThreshold=1.0       \
  -dMonoImageDownsampleThreshold=1.0       \
  -dProcessColorModel=/DeviceGray          \
  -dColorConversionStrategy=/Gray          \
  -dColorConversionStrategyForImages=/Gray \
  -dCompatibilityLevel=1.4                 \
  -dEmbedAllFonts=false                    \
  -c ".setpdfwrite <</AlwaysEmbed [ ] /NeverEmbed [/Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique /Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique /Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic /Symbol /ZapfDingbats] /ColorImageFilter /DCTEncode /GrayImageFilter /DCTEncode /MonoImageFilter /CCITTFaxEncode /OutputICCProfile (None)>> setdistillerparams" \
  -f big.pdf

(Wechseln Sie unter Windows gszu gswin32c.exeoder gswin64c.exe, und ändern Sie alle Zeilenfortsetzungsmarkierungen \zu ^...) Der obige Befehl ändert Folgendes:

  1. Konvertieren Sie alle Bilder in den Graustufen-Farbraum.
  2. Heben Sie die Einbettung aller Helvetica-, Courier-, Times-, Symbol- und ZapfDingbats-Schriftarten auf (die „Basis 14“ für PDF).
  3. Alle Bilder auf 72 PPI herunterrechnen, wenn die aktuelle Auflösung des jeweiligen Bildes über 72 PPI liegt.
  4. Ändern Sie nach Möglichkeit die gesamte Bildkomprimierung in JPEG-Komprimierung ( /DCTEncode).
  5. Verwerfen Sie eingebettete ICC-Ausgabeprofile, wenn möglich.

Aktualisierung/Korrektur

Mein ursprünglicher Beispielbefehl hatte einen Tippfehler. Es hatte diese Zeilen enthalten, die falsch sind :

 -sProcessColorModel=/DeviceGray          \
 -sColorConversionStrategy=/Gray          \
 -sColorConversionStrategyForImages=/Gray \

Es gibt zwei verschiedene Möglichkeiten, diese Optionen korrekt auszudrücken :

  1. Verwendung -d für diese Parameter. In diesem Fall müssen Schrägstriche/für die Parameterwerte stehen:

    -dProcessColorModel=/DeviceGray          \
    -dColorConversionStrategy=/Gray          \
    -dColorConversionStrategyForImages=/Gray \
    
  2. Verwendung -s für diese Parameter. In diesem Fall müssen die Schrägstriche/für die Parameterwerte übersprungen werden:

    -sProcessColorModel=DeviceGray          \
    -sColorConversionStrategy=Gray          \
    -sColorConversionStrategyForImages=Gray \
    

(Allerdings lässt sich aus diesem Beispiel keine allgemeine Regel für alle Ghostscript-Optionen ableiten, sie gilt nur für eine bestimmte Teilmenge von Parametern, bei denen -s...oder -d...alternativ so verwendet werden kann.)

Also ich habe es genau falsch herum verstanden. Entschuldigung für die Verwirrung, die dadurch verursacht wurde!

In jedem Fall funktioniert der geänderte Befehl für die big.pdfjetzt verknüpften OPs. Es bringt herunter

  • die Originalgröße von 2,5 MByte für ein 1-seitiges PDF, das ein Farbbild enthält
  • die neue Größe von 53 kByte für ein PDF, das ein Graustufenbild enthält.

Daten für Originalbild innen big.pdf:

$ pdfimages -list big.pdf

  page num  type width height color comp bpc  enc interp objID x-ppi y-ppi size ratio
  -----------------------------------------------------------------------------------
     1   0 image  1600  1071  rgb     3   8  image  no     7 0   142   142 2502K  50%  

Daten für neues Bild innen smaller-downsampled+gray.pdf:

$ pdfimages -list smaller-downsampled+gray.pdf

  page num  type width height color comp bpc  enc interp objID x-ppi y-ppi size ratio
  -----------------------------------------------------------------------------------
     1   0 image   800   535  gray    1   8  jpeg   no    12 0    71    71 48.5K  12%
Entschuldigung für die Unwissenheit, aber ich brauche nur eine kleine Erklärung, da ich Ghostscript noch nie zuvor verwendet habe. Ich habe es heruntergeladen und in einem Ordner auf der Festplatte abgelegt, ich habe auch ein PDF mit dem Namen grey.pdf in dasselbe Verzeichnis gelegt und einen Stapel erstellt, in den ich alle oben genannten kopiert habe, aber gs in gswin64.exe geändert und es zeigt einige Fehler an Ich habe alle "\" entfernt, aber immer noch nichts.
@FateTrader: In einer Windows *.bat-Datei müssen Sie auch die Zeilenenden in ändern ^. Und eventuell die Leerzeichen am Zeilenanfang entfernen. (Ich dachte, jemand, der explizit nach einem Befehlszeilentool fragt, weiß das.)
Oh, und "big.pdf" ist offensichtlich die Eingabe , small-downsampled+gray.pdf ist die Ausgabedatei.
Ich habe alle "/" in "^" geändert und Leerzeichen vor Zeilen und zwischen Zeilenendebefehlen und "^" entfernt und immer noch nichts. Siehe Screenshot oi60.tinypic.com/20r0l09.jpg
@FateTrader: Ich habe NICHT über das Ersetzen /gesprochen - ich habe über das Ersetzen von \ als Zeilenfortsetzungsmarkierungen gesprochen! Ich habe auch NICHT dafür geworben, Leerzeichen am Zeilenende vor den (neuen) ^Schildern zu entfernen (es muss mindestens 1 Leerzeichen bleiben!).
Seufzgswin64.exe ... @FateTrader: Außerdem habe ich die Verwendung für Windowsnicht empfohlengswin64c.exe(beachten Sie dascvor dem.exe?!?)
@FateTrader: Sie sollten ein (Link zu einem) Beispiel "big.pdf" zum Testen bereitstellen ...
Entschuldigung, ich meinte "\", trotzdem habe ich es mit "gswin64c.exe" versucht und immer noch kein Glück. Ich habe alle Dateien hier hochgeladen mediafire.com/?37yjemt3eo28obq und die Fledermaus, die ich benutzt habe, ist run2.bat
@FateTrader: Meine Güte! Ich habe einen Fehler gemacht, als ich den ursprünglichen Befehl aufgeschrieben habe. Siehe meine korrigierte Antwort oben. Entschuldigung, dass ich damit Verwirrung gestiftet habe.
Hmm .. @KenS sagt, dass es einfach keinen *ColorConversionStrategyForImagesSchalter gibt ( 1 , 2 , 3 , 4 ). (Und es gibt keine solche Zeichenfolge im Code.)