当前位置:  开发笔记 > 编程语言 > 正文

用于IndirectObject提取的pyPdf

如何解决《用于IndirectObject提取的pyPdf》经验,为你挑选了1个好方法。

按照这个例子,我可以将所有元素列入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
<>
    /ExtGState <>
    /Font<>
    /ProcSet[/PDF/Text/ImageC]
    /Properties<>/MC1<> >>
    /XObject<>>>
  /Rotate 0/StructParents 0/Type/Page>>
endobj
...
...
...
584 0 obj
<>stream

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

endstream
endobj

如何跟踪该584值以引用我的字符串(当然在pyPdf下)?



1> Jehiah..:

每个元素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()

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有