Startseite»  Informatik» 

PDF in JPG umwandeln mit ImageMagick

Heute stand ich vor dem Problem, dass ich aus einem Scan vom Kopierer, der im PDF-Format vorlag, die einzelnen Seiten als JPG-Bild extrahieren wollte. Eine große Hilfe dabei ist das Programm ImageMagick, dass für Linux, MacOS und Windows verfügbar ist. Mit dem Kommandozeilenbefehl magick bzw. für ältere Versionen convert ist diese Aufgabe ganz schnell erledigt.

magick dokument.pdf dokument.jpg

produziert für jede Seite der Datei dokument.pdf eine JPEG-Datei mit dem Dateiname dokument-N.jpg, wobei N für die Seitenummer des PDF-Dokuments steht.

Es ist auch möglich nur bestimmte Seiten aus der PDF-Datei in ein JPG umzuwandeln. Dazu werden die gewünschten Seiten in eckigen Klammern hinter den Namen des PDF-Dokuments eingegeben.

magick dokument.pdf[0] dokument.jpg

wandelt nur die erste Seite um.

magick dokument.pdf[1,7,12] dokument.jpg

wandelt die Seiten 2, 8 und 13 in Bilder um.

magick dokument.pdf[19-29] dokument.jpg

wandelt die Seiten 20 bis 30 in Bilder um.

Allerdings trat jetzt das erste Problem auf. Beim Umwandeln geht ImageMagick von einer Auflösung von 72 dpi aus. Dies führt zu JPEG-Bildern mit einer sehr kleinen Pixelgröße. Ziel war es natürlich, die Bilder auch in der beim Scan verwendeten Auflösung von 300 dpi zu erstellen. Um die Auflösung des PDF-Dokuments vorzugeben, kann der Schalter -density verwendet werden.

magick -density 300 dokument.pdf dokument.jpg

Und schon hatte ich schön große Bilder. Allerdings haben die nicht nur eine große Pixelgröße, sondern brauchen auch viel Speicher. In meinem Fall lag eine Seite bei 2,1 MiB.

JPEG verwendet ein verlustbehaftetes Kompressionsverfahren, dessen Stärke eingestellt werden kann. ImageMagick versucht den Kompressionsgrad aus der Originaldatei zu ermitteln. Falls dies nicht möglich ist, verwendet ImageMagick den Wert 92 als Vorgabe. Mit dem Schalter -quality kann man die Qualität selber einstellen, denn 92 ist ein relativ hoher Wert, der zu großen JPEG-Dateien führt. In den meisten Fällen kann eine deutlich kleinere Qualität bzw. höhere Kompression gewählt werden, ohne dass es zu einer nennenswerten Verschlechterung des Bildes kommt.

magick -density 300 dokument.pdf -quality 70 dokument.jpg

Mit dem Kompressionsgrad 70 war ich sehr zufrieden. Die Dateigröße lag jetzt bei 871,6 KiB und ich konnte keinen relevanten Qualitätsunterschied zwischen kleiner und großer Version feststellen. Aber vielleicht bekommen wir die Dateigröße noch weiter reduziert. Helfen kann hier ein ganz leichter Weichzeichner (-gaussian-blur 0.05). Besonders bei großen Bildern und Grafiken fällt der optisch nicht ins Gewicht.

magick -density 300 dokument.pdf -quality 70 -gaussian-blur 0.05 dokument.jpg

Die Datei ist jetzt nur noch 714,2 KiB groß und in meinem Fall hatte ich sogar den Eindruck, dass die Scans mit dem Weichzeichner besser aussahen als ohne Weichzeichner.

Eine bessere Anordung der Daten für rot, grün und blau kann man mit dem Befehl -interlace einstellen. Dies optimiert auch den Speicherbedarf des JPEG-Bildes, da die Kompressionsalgorithmen besser arbeiten können.

magick -density 300 dokument.pdf -quality 70 -gaussian-blur 0.05 -interlace Plane dokument.jpg

Jetzt war die Datei nur noch 686,0 KiB groß.

In einem JPEG-Bild können neben den Bilddaten noch andere Informationen gespeichert werden. Oft braucht man diese nicht oder sie enthalten sogar Informationen, wie z.B. das Aufnahmedatum, die man nicht mit anderen teilen will. Mit dem Befehl -strip werden alle Kommentare und sonstigen Informationen aus dem Bild entfernt.

magick -density 300 dokument.pdf -strip -quality 70 -gaussian-blur 0.05 -interlace Plane dokument.jpg

Das hat nochmal fast 4 KiB eingespart, so dass zum Schluß noch 682,2 KiB übrig waren.

Diese Befehlskombination hat bei mir die besten Ergebnisse gebracht. Bei anderen Ursprungsbilder können diese Parameter zu schlechteren Ergebnisse führen. Dort helfen vielleicht Parameter wie -smapling-factor 4:2:0 und -define jpeg:dct-methode=float weiter, die bei mir aber zu keiner Verbesserung der Dateigröße geführt haben.