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 konvertierenpdf2ps 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.)