pyPdf для извлечения IndirectObject

Следуя этому примеру, я могу перечислить все элементы в файл PDF

import pyPdf
pdf = pyPdf.PdfFileReader(open("pdffile.pdf"))
list(pdf.pages) # Process all the objects.
print pdf.resolvedObjects

теперь, я должен извлечь нестандартный объект из файла PDF.

Мой объект является тем под названием MYOBJECT, и это - строка.

Часть, распечатанная сценарием Python, который касается меня:

{'/MYOBJECT': IndirectObject(584, 0)}

Файл PDF - это:

558 0 obj
<</Contents 583 0 R/CropBox[0 0 595.22 842]/MediaBox[0 0 595.22 842]/Parent 29 0 R/Resources
  <</ColorSpace <</CS0 563 0 R>>
    /ExtGState <</GS0 568 0 R>>
    /Font<</TT0 559 0 R/TT1 560 0 R/TT2 561 0 R/TT3 562 0 R>>
    /ProcSet[/PDF/Text/ImageC]
    /Properties<</MC0<</MYOBJECT 584 0 R>>/MC1<</SubKey 582 0 R>> >>
    /XObject<</Im0 578 0 R>>>>
  /Rotate 0/StructParents 0/Type/Page>>
endobj
...
...
...
584 0 obj
<</Length 8>>stream

1_22_4_1     --->>>>  this is the string I need to extract from the object

endstream
endobj

Как я могу следовать 584 оцените для обращения к моей строке (под pyPdf, конечно)??

10
задан Justin 20 August 2012 в 22:54
поделиться

3 ответа

каждый элемент в pdf.pages словарь, так предположение, что это находится на странице 1, pdf.pages[0]['/MYOBJECT'] должен быть элемент, который Вы хотите.

Можно попытаться распечатать это индивидуально или ввести по абсолютному адресу в нем с help и dir в подсказке Python для больше о том, как получить строку, которую Вы хотите

Править:

после получения копии PDF я нашел объект в pdf.resolvedObjects[0][558]['/Resources']['/Properties']['/MC0']['/MYOBJECT'] и значение может быть получено через getData ()

следующая функция уступает более универсальному дорогу для решения этого путем рекурсивного поиска рассматриваемого ключа

import types
import pyPdf
pdf = pyPdf.PdfFileReader(open('file.pdf'))
pages = list(pdf.pages)

def findInDict(needle,haystack):
    for key in haystack.keys():
        try:
            value = haystack[key]
        except:
            continue
        if key == needle:
            return value
        if type(value) == types.DictType or isinstance(value,pyPdf.generic.DictionaryObject):  
            x = findInDict(needle,value)
            if x is not None:
                return x

answer = findInDict('/MYOBJECT',pdf.resolvedObjects).getData()
8
ответ дан 3 December 2019 в 23:15
поделиться

IndirectObject обращается к фактическому объекту (он похож на ссылку или псевдоним так, чтобы общий размер PDF мог быть уменьшен, когда то же содержание появляется в нескольких местах). getObject метод даст Вам фактический объект.

Если объект является текстовым объектом, то просто выполнение ул. () или unicode () на объекте должно получить Вас данные в нем.

С другой стороны, pyPdf хранит объекты в атрибуте resolvedObjects. Например, PDF, который содержит этот объект:

13 0 obj
<< /Type /Catalog /Pages 3 0 R >>
endobj

Может быть считан с этим:

>>> import pyPdf
>>> pdf = pyPdf.PdfFileReader(open("pdffile.pdf"))
>>> pages = list(pdf.pages)
>>> pdf.resolvedObjects
{0: {2: {'/Parent': IndirectObject(3, 0), '/Contents': IndirectObject(4, 0), '/Type': '/Page', '/Resources': IndirectObject(6, 0), '/MediaBox': [0, 0, 595.2756, 841.8898]}, 3: {'/Kids': [IndirectObject(2, 0)], '/Count': 1, '/Type': '/Pages', '/MediaBox': [0, 0, 595.2756, 841.8898]}, 4: {'/Filter': '/FlateDecode'}, 5: 147, 6: {'/ColorSpace': {'/Cs1': IndirectObject(7, 0)}, '/ExtGState': {'/Gs2': IndirectObject(9, 0), '/Gs1': IndirectObject(10, 0)}, '/ProcSet': ['/PDF', '/Text'], '/Font': {'/F1.0': IndirectObject(8, 0)}}, 13: {'/Type': '/Catalog', '/Pages': IndirectObject(3, 0)}}}
>>> pdf.resolvedObjects[0][13]
{'/Type': '/Catalog', '/Pages': IndirectObject(3, 0)}
4
ответ дан 3 December 2019 в 23:15
поделиться

Метод Jehiah хорош при искании везде объекта. Мое предположение (смотрящий на PDF) - то, что это всегда находится в том же месте (первая страница в свойстве 'MC0'), и таким образом, намного более простой метод нахождения строки был бы:

import pyPdf
pdf = pyPdf.PdfFileReader(open("file.pdf"))
pdf.getPage(0)['/Resources']['/Properties']['/MC0']['/MYOBJECT'].getData()
2
ответ дан 3 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: