Konvertieren eines PDF in PNG

83

Ich versuche, ein PDF in ein PNG-Bild zu konvertieren (mindestens das Cover eines). Ich extrahiere erfolgreich die erste Seite des PDF mit pdftk. Ich benutze imagemagick, um die Konvertierung durchzuführen:

convert cover.pdf cover.png

Dies funktioniert, aber leider wird die Datei cover.png falsch gerendert (einige der Alpha-Objekte in der PDF-Datei werden nicht richtig gerendert). Ich weiß, dass ImageMagick GhostScript verwendet, um die Konvertierung durchzuführen, und wenn ich es direkt mit gs mache, kann ich die gewünschten Ergebnisse erzielen, aber ich würde lieber die Konvertierungsbibliothek verwenden, da sie andere Tools enthält, die ich nutzen möchte.

Dieser Befehl in GhostScript führt das gewünschte Bild aus:

gs -sDEVICE=pngalpha -sOutputFile=cover.png -r144 cover.pdf

Ich frage mich, ob es eine Möglichkeit gibt, Argumente durch Konvertieren in GhostScript zu übergeben, oder ob ich GhostScript nicht direkt aufrufen kann.

Adam
quelle
2
Warum ist das direkte Aufrufen von GhostScript ein Problem?
Kquinn
Es ist wirklich keine so große Sache. Ich möchte einige andere Parameter gleichzeitig durch convert konvertieren und es wäre schön, wenn ich alles in einem Befehl behalten könnte. Hält meinen Code sauberer und konsistenter. Es bedeutet auch eine temporäre Datei weniger.
Adam
Was ist der Unterschied zwischen dem Aufruf von gs und dem Aufruf von ImageMagick? Könnte es wert sein, ImageMagick etwas vorgelagertes zu melden (Hinweis für Follower, das Aktualisieren von Ghostscript kann ebenfalls hilfreich sein ...)
Rogerdpack

Antworten:

70

Sie können eine Befehlszeile mit zwei Befehlen ( gs, convert) verwenden, die über eine Pipe verbunden sind, wenn der erste Befehl seine Ausgabe in stdout schreiben kann und der zweite seine Eingabe von stdin lesen kann.

  1. Zum Glück kann gs in stdout ( ... -o %stdout ...) schreiben .
  2. Zum Glück kann convert von stdin ( convert -background transparent - output.png) lesen .

Problem gelöst:

  • GS für den Alpha-Kanal, der ein spezielles Bild verarbeitet,
  • konvertieren verwendet, um transparenten Hintergrund zu erstellen,
  • Pipe, um zu vermeiden, dass eine temporäre Datei auf die Festplatte geschrieben wird.

Komplette Lösung:

gs -sDEVICE=pngalpha       \
   -o %stdout              \
   -r144 cover.pdf         \
   |                       \
convert                    \
   -background transparent \
   -                       \
    cover.png

Aktualisieren

Wenn Sie ein separates PNG pro PDF-Seite haben möchten, können Sie die folgende %dSyntax verwenden:

gs -sDEVICE=pngalpha -o file-%03d.png -r144 cover.pdf

Dies erzeugt PNG Dateien mit dem Namen page-000.png, page-001.png... (Beachten Sie, dass die %d-Zählwaagen nullbasiert ist - file-000.pngentspricht der Seite 1 des PDF, 001auf Seite 2 ...

Wenn Sie Ihren transparenten Hintergrund für ein 100-seitiges PDF beibehalten möchten, tun Sie dies auch

for i in {1..100}; do        \
                             \
  gs -sDEVICE=pngalpha       \
     -dFirstPage="${i}"      \
     -dLastPage="${i}"       \
     -o %stdout              \
     -r144 input.pdf         \
     |                       \
  convert                    \
     -background transparent \
     -                       \
      page-${i}.png ;        \
                             \
done
Kurt Pfeifle
quelle
7
Dies funktioniert nur bei mir, wenn ich -dBATCH -dNOPAUSE -dQUIETdie gs-Optionen hinzufüge .
Ford
@ford: Das heißt, Sie haben eine alte Version von Ghostscript. Neuere Versionen können dies -o output.fileund dies wird automatisch und stillschweigend -dBATCH -dNOPAUSE -dQUIETgleichzeitig eingestellt.
Kurt Pfeifle
@ford: Allerdings hatte ich an anderer Stelle in der obigen Antwort einen schwerwiegenden Tippfehler. Ich frage mich, warum es trotzdem 22 Upvotes gab :-)
Kurt Pfeifle
Arbeit finden für mich, aber ich möchte automatisch ein mehrseitiges PDF in image_1.png, image_2.png konvertieren ... Ist das in einem Befehl einfach, sollte ich jede Seite zuerst aus der PDF-Datei extrahieren?
Tarass
Ok, ich habe Bilder getrennt. Aber ich möchte "-transparence white" als "convert" -Parameter während der Konvertierung. Ich konnte es mit der Pfeife machen, aber ohne?
Tarass
29

Von allen verfügbaren Alternativen fand ich Inkscape, um die genauesten Ergebnisse beim Konvertieren von PDFs in PNG zu erzielen. Insbesondere wenn die Quelldatei transparente Ebenen hatte, war Inkscape dort erfolgreich, wo Imagemagick und andere Tools fehlschlugen.

Dies ist der Befehl, den ich benutze:

inkscape "$pdf" -z --export-dpi=600 --export-area-drawing --export-png="$pngfile"

Und hier ist es in einem Skript implementiert:

#!/bin/bash

while [ $# -gt 0 ]; do

pdf=$1
echo "Converting "$pdf" ..."
pngfile=`echo "$pdf" | sed 's/\.\w*$/.png/'`
inkscape "$pdf" -z --export-dpi=600 --export-area-drawing --export-png="$pngfile"
echo "Converted to "$pngfile""
shift

done

echo "All jobs done. Exiting."
Glutanimate
quelle
21

Verwenden Sie die folgenden Befehle, um PDF-Dateien in Bilddateien zu konvertieren:

Für PNG gs -sDEVICE=png16m -dTextAlphaBits=4 -r300 -o a.png a.pdf

Für JPG gs -sDEVICE=jpeg -dTextAlphaBits=4 -r300 -o a.jpg a.pdf

Wenn Sie mehrere Seiten haben, fügen Sie den Namen % 03d hinzu gs -o a%03d.jpg a.pdf

Was jede Option bedeutet:

  • sDEVICE = {jpeg, pngalpha, png16m ...} - Dateityp
  • -o - Ausgabedatei (% stdout bis stdout)
  • -dTextAlphaBits = 4 - Schriftart-Antialiasing.
  • -r300 - 300 dpi
Yanpas
quelle
9

Sie können auch die im poppler-utilsPaket enthaltenen Befehlszeilenprogramme verwenden :

sudo apt-get install poppler-utils
pdftoppm --help
pdftocairo --help

Beispiel:

pdftocairo -png mypage.pdf mypage.png
Turdus-Merula
quelle
1
Es ist sehr gut. Wenn das PDF mehrseitig ist, gibt es mehrere PNG-Dateien.
Tomasz Gandor
5

Die akzeptierte Antwort konnte nicht funktionieren. Dann stellte sich heraus, dass die Lösung ohnehin viel einfacher ist, da Ghostscript nicht nur PNG nativ unterstützt, sondern sogar mehrere verschiedene "Codierungen" :

  • png256
  • png16
  • pnggray
  • pngmono
  • ...

Der Shell-Befehl, der für mich funktioniert, lautet:

gs -dNOPAUSE -q -sDEVICE=pnggray -r500 -dBATCH -dFirstPage=2 -dLastPage=2 -sOutputFile=test.png test.pdf

Es wird Seite 2 von test.pdf unter Verwendung der pnggrayCodierung und 500 DPI in test.png gespeichert .

Raffael
quelle
2

Hier ist eine deutsche Diskussion über ein Problem wie dieses für SVG-Dateien, bei dem es mithilfe von gelöst wird

convert -background transparent

Vielleicht funktioniert das auch bei Ihnen.

Schnaader
quelle
Leider nein, das löst mein Problem nicht. Es ist eigentlich ein Bild in der PDF, das einen Alphakanal hat, der über allem liegt.
Adam
2

Ich werde meine Lösung hinzufügen, obwohl ich dachte, sein Thread ist alt. Vielleicht hilft das trotzdem jemandem.

Zuerst muss ich das PDF generieren. Ich benutze XeLaTeX dafür:

xelatex test.tex

Jetzt analysieren ImageMagick und GraphicMagic beide Parameter von links nach rechts, sodass der Parameter ganz links zuerst ausgeführt wird. Am Ende habe ich diese Sequenz für eine optimale Verarbeitung verwendet:

gm convert -trim -transparent white -background transparent -density 1200x1200 -resize 25% test.pdf test.png

Es gibt schöne Grafiken auf transparentem Hintergrund, die auf das zugeschnitten sind, was sich tatsächlich auf der Seite befindet. Die -densityund -resizeParameter, geben eine bessere Granularität und die Gesamtauflösung erhöhen.

Ich schlage vor, zu prüfen, ob die Dichte für Sie verringert werden kann. Dadurch wird die Konvertierungszeit verkürzt.

Polemon
quelle
2

Für ein PDF, das ImageMagick mit ungenauen Farben lieferte, stellte ich fest, dass GraphicsMagick einen besseren Job machte:

$ gm convert -quality 100 -thumbnail x300 -flatten journal.pdf\[0\] cover.jpg
aorth
quelle
Nicht genug Informationen, um sicher zu sein, aber dies könnte daran liegen, dass die Farbräume nicht richtig definiert wurden. Überprüfen Sie die Option -colorspace IM.
Rivimey
2

Da diese Seite auch alternative Tools auflistet, erwähne ich xpdf, das Befehlszeilentools enthält, die für Linux / Windows / Mac kompiliert sind. Unterstützt Transparenz. Ist kostenlos für den kommerziellen Gebrauch - im Gegensatz zu Ghostscript, das wirklich unverschämte Preise hat.

In einem Test mit einer riesigen PDF-Datei war es 7,5% schneller als Ghostscript.

(Es hat auch PDF zu Text und HTML Konverter)

TheStoryCoder
quelle
Ich habe dies jetzt für eine Weile verwendet und es funktioniert gut. Im Allgemeinen ist es bei höheren Auflösungen etwas langsamer als Ghostscript. Aber Bilder sehen viel besser aus (wenn auch etwas dunkler) und Anti-Aliasing, das ich in Ghostscript verwenden könnte, funktioniert in xpdf großartig!
TheStoryCoder
2

Versuchen Sie, eine einzelne Seite zu extrahieren.

$ page = 4

gs -sDEVICE=pngalpha -dFirstPage="$page" -dLastPage="$page" -o thumb.png -r144 input.pdf
Ezequiel Fernandez
quelle
1

Meine Lösung ist viel einfacher und direkter. Zumindest funktioniert es auf meinem PC so (mit den folgenden Spezifikationen):

me@home: my.folder$ uname -a
Linux home 3.2.0-54-generic-pae #82-Ubuntu SMP Tue Sep 10 20:29:22 UTC 2013 i686 i686 i386 GNU/Linux

mit

me@home: my.folder$ convert --version
Version: ImageMagick 6.6.9-7 2012-08-17 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC
Features: OpenMP

Also, hier ist was ich auf meinem laufe file.pdf:

me@home: my.folder$ convert -density 300 -quality 100 file.pdf file.png
polarisieren
quelle
Ja, das ist es, was das OP anfangs versucht hat, aber es konnte nicht dazu führen, dass etwas anderes darunter funktioniert, wenn ImageMagick Ghostscript aufruft ... aber wenn es funktioniert, machen Sie es :)
Rogerdpack
0

Sie können ImageMagick verwenden, ohne die erste Seite der PDF-Datei mit anderen Tools zu trennen. Mach einfach

convert -density 288 cover.pdf[0] -resize 25% cover.png


Hier erhöhe ich die Nenndichte um 400% (72 * 4 = 288) und verkleinere sie dann um 1/4 (25%). Dies ergibt eine viel bessere Qualität für das resultierende PNG.

Wenn das PDF jedoch CMYK ist, unterstützt PNG dies nicht. Es müsste in sRGB konvertiert werden, insbesondere wenn es transparent ist, da Ghostscript CMYK nicht mit Alpha verarbeiten kann.

convert -density 288 -colorspace sRGB -resize 25% cover.pdf[0] cover.png
fmw42
quelle