Schnelle PDF-zu-JPG-Konvertierung unter Linux gesucht [geschlossen]

11

Ich verwende derzeit ImageMagick, um PDFs in JPEG-Rasterbilder zu konvertieren. Es ist schmerzhaft langsam und verbraucht viel Speicher.

Der Befehl, den ich benutzte, war:

convert -geometry 1024x768 -density 200 -colorspace RGB foo.pdf bar%02d.jpg

Ich denke, dass es langsam ist, weil es Ghostscript verwendet. Aber es muss einen schnelleren Weg geben, dies auf einer Linux-Box zu tun.

Hat jemand eine bessere Lösung gefunden?

mat3001
quelle
Wie viel Zeit, wie viel Speicher?
Zoredache

Antworten:

18

Die direkte Verwendung von Ghostscript (anstelle des convertBefehls von ImageMagick , der Ghostscript indirekt aufruft) ist in der Tat schneller. Außerdem erhalten Sie mehr Kontrolle über die Konvertierungsparameter. Versuchen

gs \
   -sDEVICE=jpeg   \
   -o bar_%03d.jpg \
   -dJPEGQ=95      \
   -r600x600       \
   -g4960x7016     \
   foo.pdf

wo

  • -o: bestimmt den Ausgabepfad + den Dateinamen (und speichert die Verwendung von -dBATCH -dNOPAUSE)
  • -dJPEGQ: Setzt die JPEG-Qualität auf 95%
  • -r: Setzt die Auflösung auf 600 dpi
  • -g: Legt die Bildgröße auf 4960 x 7016 Pixel fest
  • -sDEVICE: Legt die Ausgabe als JPEG fest

Dieser Befehl wird wahrscheinlich immer noch zu langsam für Sie sein und Dateien erstellen, die größer als erwartet sind. Versuchen Sie dies für kleinere Dateigrößen und eine schnellere Ausführung (was wahrscheinlich der Ausgabequalität Ihrer Befehlszeile nahe kommt convert):

gs \
   -sDEVICE=jpeg   \
   -o bar_%03d_200dpi_q80.jpg \
   -dJPEGQ=80      \
   -r200x200       \
   -g1653x2339     \
   foo.pdf

oder auch

gs \
   -sDEVICE=jpeg   \
   -o bar_%03d_default_a4.jpg \
   -sPAPERSIZE=a4 \
   foo.pdf

(Dies ergibt eine Auflösung von 72 dpi, oft gut genug für die meisten Bildschirme und für die meisten Webanwendungen).

Kurt Pfeifle
quelle
1
Du hast recht. Ich habe wirklich nicht gedacht, dass Imagemagick der Engpass sein würde. Aber ich hätte es wahrscheinlich versuchen sollen. Danke auch für die tollen Beispiele!
mat3001
10

Übrigens ist einer der Gründe, warum ImageMagick so viel langsamer ist, dass es Ghostscript zweimal aufruft. PDF => PNG wird nicht auf einmal konvertiert, sondern es werden zwei verschiedene Schritte ausgeführt:

  • Es verwendet zuerst Ghostscript für die PDF => PostScriptKonvertierung.
  • Anschließend wird Ghostscript für die PostScript => PNGKonvertierung verwendet.

Sie können die detaillierten Einstellungen der "Delegaten" von ImageMagick (die externen Programme, die ImageMagick verwendet, wie z. B. Ghostscript) durch Eingabe eingeben

convert -list delegate

(Auf meinem System ist das eine Liste von 32 verschiedenen Befehlen.) Um zu sehen, welche Befehle zum Konvertieren in PNG verwendet werden, verwenden Sie Folgendes:

convert -list delegate | grep -i png

Ok, das war für Linux. Wenn Sie unter Windows arbeiten, versuchen Sie Folgendes:

convert -list delegate | findstr /i png

Sie werden feststellen, dass IM PNG nur über PS- oder EPS-Eingaben erzeugt. Wie erhält IM (E) PS aus Ihrem PDF? Einfach:

convert -list delegate | findstr /i PDF
convert -list delegate | grep -i PDF

Ah! Es verwendet Ghostscript, um eine PDF => PS-Konvertierung durchzuführen, und verwendet Ghostscript erneut, um eine PS => PNG-Konvertierung durchzuführen. Funktioniert, ist aber nicht der effizienteste Weg, wenn Sie wissen, dass Ghostscript PDF => PNG auf einmal ausführen kann . Und schneller. Und in viel besserer Qualität.

Über IMs Umgang mit der PDF-Konvertierung in Bilder über den Ghostscript-Delegaten sollten Sie in erster Linie zwei Dinge wissen:

  1. Wenn Sie keinen zusätzlichen Parameter angeben, gibt Ghostscript standardmäßig Bilder mit einer Auflösung von 72 dpi aus. Aus diesem Grund schlagen die Leute hier manchmal vor, -density 600einen convertParameter hinzuzufügen , der Ghostscript anweist, eine Auflösung von 600 dpi für die Bildausgabe zu verwenden.
  2. Der Umweg von IM, Ghostscript zweimal aufzurufen, um zuerst zu konvertieren, PDF => PSund dann PS => PNGein echter Fehler. Weil Sie nie gewinnen und die Qualität im ersten Schritt behalten, aber sehr oft etwas verlieren. Gründe dafür:
    • PDF kann mit Transparenzen umgehen, was PostScript nicht kann.
    • PDF kann TrueType-Schriftarten einbetten, was PostScript nicht kann. etc.pp.
      (Umrechnung in die entgegengesetzte Richtung, dafür PS => PDFist das nicht so kritisch ....)

Aus diesem Grund hatte ich vorgeschlagen, dass Sie Ihre PDF-Dateien mit Ghostscript auf einmal in PNG (oder JPEG) konvertieren. Und verwenden Sie die neueste Version 8.71 (bald verfügbar : 9.00) von Ghostscript ...

Kurt Pfeifle
quelle
6

Das Programm pdftoppmaus dem Poppler-Paket kann auch JPEGs erstellen, und für mich ist es ungefähr doppelt so schnell wie gsoben beschrieben:

pdftoppm -jpeg -r 300 foo.pdf foo.jpg
user177876
quelle
Was für ein toller Vorschlag. Ich habe gerade einen großen, App-abstürzenden Fehler behoben, durch den ich dank dieser Antwort zu pdftoppm gewechselt bin - ich wusste noch nie davon!
Danmactough
Sie, Sir, verdienen eine Medaille dafür :)
Milan Todorovic
2
es ist nicht schneller als gs
Ghilas BELHADJ
6

Nach meiner Erfahrung ist MuPDF viel schneller als Ghostscript. Es ist ein viel neueres Projekt ohne viel Cruft in gs. Versuchen Sie, ob es für Ihren Anwendungsfall passt!

mudraw -w 1024 -h 768 -r 200 -c rgb -o bar%d.png foo.pdf

Wenn Sie eine ältere Linux-Distribution haben und mupdf-tools aus dem Repository installiert haben, wird diese mudrawmöglicherweise weiterhin aufgerufenpdfdraw

Sie müssen dann das PNG in JPEG konvertieren, indem Sie beispielsweise imagemagick verwenden. Aber es wird immer noch schneller als Ghostscript sein.

Josef sagt Reinstate Monica
quelle
2
In meinem Test ist die PDF-zu-PNG-Konvertierung von MuPDF etwa 5-6-mal schneller als die von Ghostscript. Vielen Dank für die Lösung!
Dmitry Akinin
1
Das ist unglaublich nützlich. Es dauert Sekunden, in denen Ghostscript Minuten dauern würde, und die Befehlszeile ist ein Kinderspiel! Vielen Dank, dass Sie mich darauf aufmerksam gemacht haben!
likeitlikeit