Wie extrahiert man Bilder aus einem PDF mit der Poppler-Bibliothek in Python?

8

Ich habe eine PDF, von der ich einige Bilder mit Python extrahieren möchte. Ich kann einfach Bilder aus der Linux-Befehlszeile mit den PDF-Bildern aus der Bibliothek poppler-utils extrahieren so :

%Vor%

Als nächstes habe ich eine Python-Bindung dafür hier gefunden und sie mit dem üblichen sudo apt-get install python-poppler installiert. Im Python-Interpreter kann ich das jetzt machen:

%Vor%

Von hier bin ich irgendwie verloren. In dieser Liste kann ich nichts finden, das dem Namen von pdfimages oder irgendetwas ähnlichem ähnelt. In den Quelldateien von python-poppler kann ich nicht einmal ein .py finden Datei.

Weiß jemand, wie ich das poppers pdfimages Werkzeug von Python benutzen könnte? Alle Tipps sind willkommen!

    
kramer65 22.10.2014, 13:47
quelle

1 Antwort

0

Ich kann Ihnen nichts über Poppler sagen, aber in pyPDF würden Sie (grob)

  • Öffnen Sie die Datei im Binärmodus und übergeben Sie die Dateiobj an pyPdf.PdfFileReader()
  • Erhalte ein Objekt für jede Seite mit getPage() ; Verwenden Sie getNumPages() , um zuerst die Gesamtzahl der Seiten zu erhalten.
  • Das Seitenobjekt ist dict-like und hat einen /Resources -Schlüssel, das resultierende Objekt hat einen /XObject -Schlüssel. Die .values() von page['/Resources']['/XObject'] können Objekte haben, für die ['SubType'] == '/Image' gilt. Das sind die gewünschten Objekte.
  • Abhängig von der Codierung des Bildes kann ['/Filter'] '/FlateDecode' , '/DCTDecode' oder andere sein. Möglicherweise müssen Sie den Datenstrom des Objekts entsprechend dem angegebenen Filter vorverarbeiten, bevor Sie sie übergeben.
  • Verwenden Sie das _data -Attribut, um die rohen Bytes zu erhalten. Schreiben Sie diese auf die Festplatte oder übergeben Sie sie an eine Bildbibliothek.

Ich habe einmal einen Hacky-Filter für PDFs geschrieben, der unter anderem viel zu große Bilder neu kodiert, um die Auflösung zu verringern. Der Code sollte Ihnen mehr Anhaltspunkte geben als die obigen Aufzählungspunkte.

Beachten Sie, dass PDF ein verdammt gutes Dateiformat ist, so dass Ihr Code viele seltsame Dinge sehen wird. Pepper deinen Code mit Assertions und immer haben eine letzte else: raise ValueError auf jedem if : -)

Beachten Sie auch, dass die oben genannte Anleitung nicht genau richtig ist. Was Sie tun möchten, ist, den PDF-Katalog zu bekommen und sich auf diese Weise zum Objekt /Resources zu arbeiten; Ich kann den Objektbaum jedoch nicht aus dem Speicher abrufen. Halten Sie die Referenz bereit.

    
user2722968 02.06.2017 19:50
quelle