GNU/Linux >> LINUX-Kenntnisse >  >> Linux

PDF-Dateien optimieren (mit Ghostscript oder anderen)

Ich verwende Ghostscript mit folgenden Optionen von hier.

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen \
 -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf

Vielleicht finden Sie diesen pdftocairo (von Poppler) kann kleinere PDFs erstellen, aber beachten Sie, dass dadurch einige Funktionen (wie Hyperlinks) entfernt werden.


Sie können gute Ergebnisse erzielen, indem Sie mit

von PDF nach Postscript und dann zurück nach PDF konvertieren
pdf2ps file.pdf file.ps
ps2pdf -dPDFSETTINGS=/ebook file.ps file-optimized.pdf

Der Wert des Arguments -dPDFSETTINGS definiert die Qualität der Bilder im resultierenden PDF. Optionen sind, von niedriger bis hoher Qualität:/screen , /default , /ebook , /printer , /prepress , siehe http://milan.kupcevic.net/ghostscript-ps-pdf/ für eine Referenz.

Die Postscript-Datei kann ziemlich groß werden, aber die Ergebnisse sind es wert. Ich wechselte von einer 60-MB-PDF-Datei zu einer 140-MB-Postscript-Datei, landete aber bei einer optimierten 1,1-MB-PDF.


Wenn Sie nach einer kostenlosen (wie in 'libre') Software suchen, ist Ghostscript sicherlich Ihre beste Wahl. Es ist jedoch nicht immer einfach zu benutzen -- einige seiner (sehr mächtigen) Verarbeitungsoptionen sind nicht leicht dokumentiert zu finden.

Sehen Sie sich diese Antwort an, die erklärt, wie Sie eine detailliertere Kontrolle über das Downsampling der Bildauflösung ausführen können als mit dem generischen -dPDFSETTINGS=/screen tut (das definiert ein paar allgemeine Standardwerte, die Sie vielleicht überschreiben möchten):

  • Wie verkleinere ich Bilder in einer PDF-Datei?

Im Grunde sagt es Ihnen, wie Sie Ghostscript dazu bringen, alle Bilder auf eine Auflösung von 72 dpi herunterzurechnen (dieser Wert ist das, was -dPDFSETTINGS=/screen verwendet -- vielleicht möchten Sie noch niedriger gehen):

-dDownsampleColorImages=true \
-dDownsampleGrayImages=true \
-dDownsampleMonoImages=true \
-dColorImageResolution=72 \
-dGrayImageResolution=72 \
-dMonoImageResolution=72 \

Wenn Sie ausprobieren möchten, ob Ghostscript in der Lage ist, die verwendeten Schriftarten auch 'auszubetten' (manchmal funktioniert es, manchmal nicht - abhängig von der Komplexität der eingebetteten Schriftart und auch vom verwendeten Schriftarttyp ), können Sie versuchen, Ihrem gs-Befehl Folgendes hinzuzufügen:

gs \
  -o output.pdf \
   [...other options...] \
  -dEmbedAllFonts=false \
  -dSubsetFonts=true \
  -dConvertCMYKImagesToRGB=true \
  -dCompressFonts=true \
  -c ".setpdfwrite <</AlwaysEmbed [ ]>> setdistillerparams" \
  -c ".setpdfwrite <</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 /Arial]>> setdistillerparams" \
  -f input.pdf

Hinweis: Beachten Sie, dass das Downsampling der Bildauflösung sicherlich die Qualität (irreversibel) verringert und das Herauslösen von Schriftarten das Anzeigen und Drucken der PDFs erschwert oder unmöglich macht, es sei denn, die gleichen Schriftarten sind auf dem Computer installiert ....

Aktualisieren

Eine Option, die ich in meiner ursprünglichen Antwort übersehen hatte, ist das Hinzufügen

-dDetectDuplicateImages=true

zur Kommandozeile. Dieser Parameter veranlasst Ghostscript, mehrfach im PDF eingebettete Bilder zu erkennen. Dies kann passieren, wenn Sie ein Bild als Logo oder Seitenhintergrund verwenden und die PDF-Erzeugungssoftware nicht für diese Situation optimiert ist. Dies war früher bei älteren Versionen von OpenOffice/LibreOffice der Fall (ich habe die neueste Version von LibreOffice, v4.3.5.2, getestet, und es macht solche dummen Dinge nicht mehr).

Es passiert auch, wenn Sie PDF-Dateien mit Hilfe von pdftk verketten . Um Ihnen den Effekt zu zeigen und wie Sie ihn entdecken können, schauen wir uns eine Beispiel-PDF-Datei an:

pdfinfo p1.pdf

 Producer:       libtiff / tiff2pdf - 20120922
 CreationDate:   Tue Jan  6 19:36:34 2015
 ModDate:        Tue Jan  6 19:36:34 2015
 Tagged:         no
 UserProperties: no
 Suspects:       no
 Form:           none
 JavaScript:     no
 Pages:          1
 Encrypted:      no
 Page size:      595 x 842 pts (A4)
 Page rot:       0
 File size:      20983 bytes
 Optimized:      no
 PDF version:    1.1

Neuere Versionen von Popplers pdfimages Dienstprogramm haben Unterstützung für -list hinzugefügt Parameter, der alle in einer PDF-Datei enthaltenen Bilder auflisten kann:

pdfimages -list p1.pdf

 page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
 --------------------------------------------------------------------------------------
    1   0 image    423   600   rgb    3   8 jpeg     no     7  0    52    52 19.2K 2.6%

Dieses Beispiel-PDF ist ein 1-seitiges Dokument, das ein Bild enthält, das mit JPEG-Komprimierung komprimiert ist, eine Breite von 423 Pixel und eine Höhe von 600 Pixel hat und mit einer Auflösung von 52 PPI auf der Seite gerendert wird.

Wenn wir 3 Kopien dieser Datei mit Hilfe von pdftk verketten etwa so:

pdftk p1.pdf p1.pdf p1.pdf cat output p3.pdf

dann zeigt das Ergebnis diese Bildeigenschaften über pdfimages -list :

pdfimages -list p3.pdf

 page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
 --------------------------------------------------------------------------------------
    1   0 image   423    600   rgb    3   8 jpeg     no     4  0    52    52 19.2K 2.6%
    2   1 image   423    600   rgb    3   8 jpeg     no     8  0    52    52 19.2K 2.6%
    3   2 image   423    600   rgb    3   8 jpeg     no    12  0    52    52 19.2K 2.6%

Dies zeigt, dass es 3 identische PDF-Objekte (mit den IDs 4, 8 und 12) gibt, die in p3.pdf eingebettet sind jetzt. p3.pdf besteht aus 3 Seiten:

pdfinfo p3.pdf | grep Pages:

 Pages:          3

Optimieren Sie PDF, indem Sie doppelte Bilder durch Referenzen ersetzen

Jetzt können wir die oben erwähnte Optimierung mit Hilfe von Ghostscript anwenden

 gs -o p3-optim.pdf -sDEVICE=pdfwrite -dDetectDuplicateImages=true p3.pdf

Überprüfung:

 pdfimages -list p3-optim.pdf

 page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
 --------------------------------------------------------------------------------------
    1   0 image   423    600   rgb    3   8 jpeg     no    10  0    52    52 19.2K 2.6%
    2   1 image   423    600   rgb    3   8 jpeg     no    10  0    52    52 19.2K 2.6%
    3   2 image   423    600   rgb    3   8 jpeg     no    10  0    52    52 19.2K 2.6%

Es wird immer noch ein Bild pro Seite aufgelistet – aber die PDF-Objekt-ID ist jetzt immer dieselbe:10.

 ls -ltrh p1.pdf p3.pdf p3-optim.pdf

   [email protected] 1 kp  staff    20K Jan  6 19:36 p1.pdf
   -rw-r--r--  1 kp  staff    60K Jan  6 19:37 p3.pdf
   -rw-r--r--  1 kp  staff    16K Jan  6 19:40 p3-optim.pdf

Wie Sie sehen können, hat die mit pdftk erstellte "dumme" Verkettung die ursprüngliche Dateigröße auf das Dreifache der ursprünglichen Größe erhöht. Die Optimierung durch Ghostscript hat es um einen erheblichen Teil gekürzt.

Die neuesten Versionen von Ghostscript können sogar den -dDetectDuplicateImages verwenden standardmäßig. (AFAIR, v9.02, das es zum ersten Mal eingeführt hat, hat es standardmäßig nicht verwendet.)


Linux
  1. Wie grep in PDF-Dateien?

  2. Cat-Dateien mit Verzeichnis?

  3. Dateien im Verzeichnis umbenennen?

  4. Sortieren Sie Dateien in einem bestimmten Ordner mit Ranger?

  5. Sichern Sie Ihre Dateien mit rsync

Finden Sie verlorene Dateien mit Scalpel

Erste Schritte mit dem Tar-Befehl

So laden Sie Dateien mit FileZilla hoch

Laden Sie Dateien mit Monsta FTP hoch

lsof-Befehl unter Linux mit Beispielen

Linux-Comm-Befehl mit Beispielen