按照这个例子,我可以将所有元素列入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下)?
每个元素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()