pdftk-Komprimierungsoption

92

Ich benutze pdftk , um ein PDF über die folgende Befehlszeile zu komprimieren

pdftk file1.pdf output file2.pdf compress

Es funktioniert, wenn das Gewicht meiner Datei abnimmt.

Gibt es [Optionen], um die Komprimierung zu ändern?

Oder vielleicht andere Lösungen, um meine Datei zu komprimieren? Es ist schwer, weil einige Grafiken viele Punkte haben . Gibt es eine Möglichkeit, diese Diagramme beispielsweise in JPG zu konvertieren und die Komprimierung anzupassen?

RockScience
quelle
1
Nach meiner Erfahrung kommt es darauf an, was sich in Ihrem PDF befindet. Wenn es sich beispielsweise um ein Diagramm mit vielen Punkten handelt, besteht die beste Lösung darin, das Diagramm in PNG zu konvertieren und dieses PNG in das PDF aufzunehmen.
RockScience

Antworten:

122

Ich hatte das gleiche Problem und fand zwei verschiedene Lösungen (siehe diesen Thread für weitere Details). Beide haben die Größe meiner unkomprimierten PDF-Datei drastisch reduziert.

  • Pixeliert (verlustbehaftet):

    convert input.pdf -compress Zip output.pdf
    
  • Nicht pixelig (verlustfrei, kann jedoch etwas anders angezeigt werden):

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

Bearbeiten : Ich habe gerade eine andere Option entdeckt (für verlustfreie Komprimierung), die den bösen Befehl gs vermeidet. qpdf ist ein nettes Tool, das PDFs konvertiert (Komprimierung / Dekomprimierung, Verschlüsselung / Entschlüsselung) und viel schneller als der Befehl gs ist:

qpdf --linearize input.pdf output.pdf
nullglob
quelle
3
Genial. gs arbeitete für mich und konvertierte eine 4-MB-Datei in 339 KB. Es gab einen Qualitätsverlust, der aber meinen Zweck ausreichend erfüllte.
Sridhar Sarnobat
27
Sie können die PDF-Einstellung "Drucker" für eine bessere Qualität verwenden:gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.5 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
imriss
10
Variieren Sie den PDFSETTINGS-Wert, um die Qualität (und damit die Größe) anzupassen. Siehe ghostscript.com/doc/current/Ps2pdf.htm#Options
1in9ui5t
6
Beachten Sie, dass der gsBefehl in der Antwort nicht gerade verlustfrei ist, da er die Auflösung und Qualität eingebetteter JPGs verringert. Aber es ist verlustfrei. Text, wobei der Text beibehalten wird, während der convertBefehl ihn in Rastergrafiken konvertiert.
Tanius
13
Die Einstellung der Option -dPDFSETTINGS=auf /ebookliefert eine sehr schöne Ausgabe für mich: Sicher, sie ist komprimiert und einige JPG-Artefakte sind sichtbar, aber für eine angemessene Größe vollständig lesbar. Vielen Dank!
Joël
35

Dieses Verfahren funktioniert ziemlich gut

pdf2ps large.pdf very_large.ps

ps2pdf very_large.ps small.pdf

Versuche es.

jortizromo
quelle
8
Dies ist keine allgemeine Lösung. In vielen Fällen ist das resultierende PDF größer.
Rotskoff
4
Dies funktionierte für mich am besten aus allen genannten Lösungen. Einige große Bilder gingen von 23 MB auf 1,4 MB zurück, wobei der Qualitätsverlust bei weitem am geringsten war.
AerandiR
1
@rotskoff Es gibt wahrscheinlich keine allgemeine Lösung, da es verschiedene Arten von Dokumenten gibt. Ich verstehe jedoch Ihren Standpunkt. Es wäre schön, wenn Software herausfinden würde, was für uns am besten funktioniert.
Tiktak
Danke, das hat bei mir funktioniert, während qpdf und gs die Größe der Ausgabedatei nicht reduziert haben.
Sebastian
1
Wie hier erwähnt, besteht ein weiterer Nachteil dieser Methode darin, dass URL-Links im Dokument unterbrochen werden.
Ptomato
29

Beim Versuch, ein PDF zu komprimieren, habe ich es mit 400ppi-Tiffs erstellt, meistens 8-Bit, einige 24-Bit, mit PackBits-Komprimierung, tiff2pdfkomprimiert mit Zip / Deflate. Ein Problem, das ich bei jeder dieser Methoden hatte: Bei keiner der oben genannten Methoden wurde das Lesezeichen-Inhaltsverzeichnis beibehalten, das ich in Acrobat Pro X sorgfältig manuell erstellt habe. Nicht einmal die empfohlene ebookEinstellung für gs. Sicher, ich könnte einfach eine Kopie des Originals mit intaktem Inhaltsverzeichnis öffnen und eine Replace pagesausführen, aber leider hat keine dieser Methoden zunächst einen zufriedenstellenden Job gemacht. Entweder haben sie die Größe so stark reduziert, dass die Qualität inakzeptabel pixeliert war, oder sie haben die Größe überhaupt nicht reduziert und sie in einem Fall trotz Qualitätsverlust tatsächlich erhöht.

pdftk compress::

no change in size
bookmarks TOC are gone

gs screen::

takes a ridiculously long time and 100% CPU
errors:
    sfopen: gs_parse_file_name failed.                                 ? 
    | ./base/gsicc_manage.c:1651: gsicc_set_device_profile(): cannot find device profile
74.8MB-->10.2MB hideously pixellated
bookmarks TOC are gone

gs printer::

takes a ridiculously long time and 100% CPU
no errors
74.8MB-->66.1MB
light blue background on pages 1-4
bookmarks TOC are gone

gs ebook::

errors:
    sfopen: gs_parse_file_name failed.
      ./base/gsicc_manage.c:1050: gsicc_open_search(): Could not find default_rgb.ic 
    | ./base/gsicc_manage.c:1651: gsicc_set_device_profile(): cannot find device profile
74.8MB-->32.2MB
badly pixellated
bookmarks TOC are gone

qpdf --linearize::

very fast, a few seconds
no size change
bookmarks TOC are gone

pdf2ps::

took very long time
output_pdf2ps.ps 74.8MB-->331.6MB

ps2pdf::

pretty fast
74.8MB-->79MB
very slightly degraded with sl. bluish background
bookmarks TOC are gone
hmj6jmh
quelle
1
Dies ist eine äußerst wertvolle Forschung (danke!), Aber es ist auch so sehr keine Antwort, dass ich einen Moment lang über ein Down-Voting nachgedacht habe.
Ndemou
3
Wie ist es keine Antwort?
hmj6jmh
21

Wenn die Dateigröße immer noch zu groß ist, kann es hilfreich sein, ps2pdf zu verwenden, um die Auflösung der erstellten PDF-Datei zu verkleinern:

pdf2ps input.pdf tmp.ps
ps2pdf -dPDFSETTINGS=/screen -dDownsampleColorImages=true -dColorImageResolution=200 -dColorImageDownsampleType=/Bicubic tmp.ps output.pdf

Passen Sie den Wert der Option -dColorImageResolution an, um ein Ergebnis zu erzielen, das Ihren Anforderungen entspricht (der Wert beschreibt die Bildauflösung in DPIs). Wenn sich Ihre Eingabedatei in Graustufen befindet, kann es auch hilfreich sein , Farbe durch Grau zu ersetzen oder beide Optionen im obigen Befehl zu verwenden. Eine weitere Feinabstimmung ist möglich, indem Sie die Option -dPDFSETTINGS auf / default oder / Drucker ändern . Erläuterungen zu allen möglichen Optionen finden Sie im ps2pdf-Handbuch .

Dominik
quelle
Danke für den Tipp. Mit -dPDFSETTINGS konnte ich die Größe meiner gescannten PDF-
Datei
1
DANKE. Ich glaube nicht, dass es für jeden Anwendungsfall eine allgemeine Lösung gibt - aber ich habe fast jede Lösung in diesem Thread ausprobiert und dies ist die einzige, die für mich funktioniert hat !!! Die Möglichkeit, den Parameter dColorImageResolution zu "optimieren", war der Schlüssel - die Dokumentgröße musste klein genug sein, damit diese Regierungssite sie akzeptiert, aber groß genug, um lesbar zu sein. Danke, Onkel Sam, für einen weiteren schmerzhaften Reifen, durch den
du
3

Nachdem ich gpdf wie von nullglob vorgeschlagen ausprobiert hatte , stellte ich fest, dass ich die gleichen Komprimierungsergebnisse (eine Datei mit ~ 900 MB bis zu ~ 30 MB) nur mit dem Cups-PDF-Drucker erhielt. Dies ist möglicherweise einfacher / bevorzugter, wenn Sie bereits ein Dokument anzeigen und nur ein oder zwei Dokumente komprimieren müssen.

In Ubuntu 12.04 können Sie dies von installieren

sudo apt-get install cups-pdf

Überprüfen Sie nach der Installation unter Systemprogramme > Administration > Drucken > klicken Sie mit der rechten Maustaste auf "PDF" und setzen Sie es auf "Aktivieren".

Standardmäßig wird die Ausgabe in einem Ordner namens PDF in Ihrem Home-Verzeichnis gespeichert .

Ryanjdillon
quelle
3

Die einzeilige Option pdf2ps (von Lee) hat die PDF-Größe tatsächlich erhöht. Die beiden Schritte waren jedoch besser. Und es kann durch Umleitung von & zu Standardeingabe / -ausgabe und Pipes in einer einzigen kombiniert werden:

pdf2ps large.pdf - | ps2pdf - small.pdf

hat ein von xsane generiertes PDF von 18 Mo auf 630 ko reduziert!

Links gehen verloren, aber für das vorliegende Beispiel ist dies kein Problem ... und der einfachste Weg, um das gewünschte Ergebnis zu erzielen.

E. Curis
quelle
Sie könnten ps2pdfstattdessen versuchen , meinen Kommentar zu @ Lees Antwort zu sehen.
Myrdd
2

pdf2ps large.pdf small.pdf ist genug, anstatt zwei Schritte

pdf2ps large.pdf very_large.ps 
ps2pdf very_large.ps small.pdf

Ist ps2pdf large.pdf small.pdfjedoch eine bessere Wahl.

  • ps2pdf ist viel schneller
  • Ohne zusätzliche Parameter wird pdf2psmanchmal eine größere Datei erstellt.
Lee
quelle
Wo haben Sie diese Option gefunden? Ist es eine Funktion in einer neueren Version? Bei mir hat es nicht funktioniert. Obwohl ich die Ausgabedatei benannt habe out.pdf, wurde sie zu einer PS-Datei ( mimetype out.pdfsagt out.pdf: application/postscript).
Myrdd
meins ist die neueste Version 9.xx. Ich bin mir nicht sicher, ob du.
Lee
Ich verwende die mit Debian Stable ("Stretch") gepackte Version 9.25. Könnten Sie durch Eingabe überprüfen, ob Sie tatsächlich eine PDF-Datei haben mimetype small.pdf?
Myrdd
die Ausgabe von mimetype small.pdfist small.pdf: application/pdf. Ich denke, das Programm kann den Dateityp automatisch anhand des Suffix bestimmen.
Lee
1
@myrdd ja, ich habe Tests gemacht. ps2pdfist besser.
Lee
1

Ich habe mit qpdf keine große Reduzierung der Dateigröße festgestellt. Der beste Weg, den ich gefunden habe, ist, nachdem pdftk fertig ist, Ghostscript zu verwenden, um PDF in Postscript und dann zurück in PDF zu konvertieren. In PHP würden Sie exec verwenden:

$ps = $save_path.'/psfile.ps';
exec('ps2ps2 ' . $pdf . ' ' . $ps);
unlink($pdf);
exec('ps2pdf ' .$ps . ' ' . $pdf);
unlink($ps);

Ich habe dies vor einigen Minuten verwendet, um die pdftk-Ausgabe von 490k auf 71k zu bringen.

Tom
quelle
PHP fügt eine völlig unnötige Komplexität hinzu und
schränkt
-2

Ich hatte das gleiche Problem und habe diese Funktion verwendet, um einzelne Seiten zu komprimieren, was dazu führt, dass die Dateigröße um bis zu 1/3 der Originalgröße komprimiert wird.

for (int i = 1; i <= theDoc.PageCount; i++)
{
       theDoc.PageNumber = i;
       theDoc.Flatten();
}
Gabbar
quelle
Verwenden Sie die C ++ - Bibliothek von pdftk?
RockScience
-2

Wenn Sie eine PDF-Datei komprimieren möchten, die viel auswählbaren Text enthält, können Sie unter Windows NicePDF Compressor verwenden - wählen Sie die Option "Flate". Nachdem ich alles ausprobiert hatte (cpdf, pdftk, gs), half es mir schließlich, mein 1360-seitiges PDF von 500 MB auf 10 MB zu komprimieren.

solf
quelle