2013-12-02 2 views
9

Есть ли способ извлечь изображения в виде потока из pdf-документа (используя библиотеку PyPDF2)? Также возможно заменить некоторые изображения на другие (сгенерированные с помощью PIL, например, или загруженные из файла)?Извлечение изображений из PDF с использованием python PyPDF2

Я могу получить EncodedStreamObject из дерева pdf-объектов и получить закодированный поток (путем вызова метода getData()), но выглядит как просто сырое содержимое без каких-либо заголовков изображений и другой метаинформации.

>>> import PyPDF2 
>>> # sample.pdf contains png images 
>>> reader = PyPDF2.PdfFileReader(open('sample.pdf', 'rb')) 
>>> reader.resolvedObjects[0][9] 
{'/BitsPerComponent': 8, 
'/ColorSpace': ['/ICCBased', IndirectObject(20, 0)], 
'/Filter': '/FlateDecode', 
'/Height': 30, 
'/Subtype': '/Image', 
'/Type': '/XObject', 
'/Width': 100} 
>>> 
>>> reader.resolvedObjects[0][9].__class__ 
PyPDF2.generic.EncodedStreamObject 
>>> 
>>> s = reader.resolvedObjects[0][9].getData() 
>>> len(s), s[:10] 
(9000, '\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc') 

Я посмотрел на PyPDF2, ReportLab и PDFMiner решения совсем немного, но ничего подобного тому, что я ищу не нашел.

Любые примеры кода и ссылки будут очень полезными.

+0

Итак, вы хотите открыть большой pdf-файл, извлечь страницы и добавить эту страницу в существующий pdf-файл? Было бы хорошо сохранить этот комбинированный pdf в качестве нового файла? – ExperimentsWithCode

+1

Этот ответ может помочь: http://stackoverflow.com/a/34116472/1513933 –

+1

Возможный дубликат [Извлечь изображения из PDF без повторной выборки в python?] (Http://stackoverflow.com/questions/2693820/extract- изображения, из-PDF-без передискретизации-в-питон) –

ответ

0

Метаданные изображения не хранятся в кодированных изображениях PDF. Если метаданные вообще хранятся, они сохраняются в самом PDF-файле, но удаляются из основного изображения. Метаданные, которые вы видите в своем примере, вероятно, все, что вы сможете получить. Возможно, что PDF-кодеры могут хранить метаданные изображений в другом месте в PDF-файле, но я этого не видел. (Обратите внимание на этот вопрос с метаданными was also asked for Java.)

Конечно, вы можете извлечь поток, однако, как вы упомянули, вы используете операцию getData.

Что касается замены, вам необходимо создать новый объект изображения с помощью PDF, добавить его в конец и соответственно обновить косвенные указатели объектов. Это будет сложно сделать с PyPdf2.

Смежные вопросы