提取嵌入的PDF - PDFInterpreterError:未知的运算符:'\ x00'

时间:2017-11-22 21:10:23

标签: python pdf scrapy pdfminer

使用Scrapy,我想将pdf下载到读取二进制文件到内存中并提取内容。我意识到pdf嵌入在一个看起来像这样的页面中:

'%PDF-1.4\n%\xe2\xe3\xcf\xd3\r\n1 0 obj\n<</Type /Page\n/Parent 2 0 R\n/MediaBox [ 0 0 612.000 792.000 ]\n/Resources <</XObject 3 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]>>/Contents [ 4 0 R ]\n/Rotate 0\n>>\r\nendobj\n5 0 obj\n<</Type /XObject /Subtype /Image\n/Name /JI1Obj1\n/Width 1275 /Height 1650\n/BitsPerComponent 8\n/ColorSpace /DeviceRGB\n/Filter [ /FlateDecode /DCTDecode ]\n/Length 6 0 R>>\r\nstream\r\nx\x9c\xed\x9dYl\x1bE\x18\x80g}\xa4I\n\x88\xa4[Sh\x11m\xe9\x

当我打开scrapy response.body for http:xxx / DocumentInquiry.aspx?DocumentNo = 12502 我看到一个以:

开头的字符串
def convert_pdf_to_html(string):

    in_memory_pdf = BytesIO(
        bytes(string))  # in_memory_pdf IS A FILE LIKE OBJECT SO DOES NOT NEED TO BE OPENED, CLOSED ETC

    rsrcmgr = PDFResourceManager()
    retstr = BytesIO()

    codec = 'utf-8'
    laparams = LAParams()

    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)  # CONSIDER TextConverter FOR TEXT
    # device = HTMLConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) # CONSIDER HTMLConverter FOR HTML

    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos = set()
    for page in PDFPage.get_pages(in_memory_pdf, pagenos, maxpages=maxpages, password=password, caching=caching,
                                  check_extractable=True):
        interpreter.process_page(page)
    device.close()
    st = retstr.getvalue()
    retstr.close()
    return st

如何在此处提取PDF格式?

编辑:我正在使用pdfminer,其功能如下:

 File "MypROJEctspiders\forc_spider.py", line 313, in get_order
    full_text = convert_pdf_to_html(response.body)
  File "MypROJEctspiders\forc_spider.py", line 51, in convert_pdf_to_html
    interpreter.process_page(page)
  File "E:\Miniconda2\envs\contact2E\lib\site-packages\pdfminer\pdfinterp.py", line 834, in process_page
    self.render_contents(page.resources, page.contents, ctm=ctm)
  File "E:\Miniconda2\envs\contact2E\lib\site-packages\pdfminer\pdfinterp.py", line 846, in render_contents
    self.execute(list_value(streams))
  File "E:\Miniconda2\envs\contact2E\lib\site-packages\pdfminer\pdfinterp.py", line 876, in execute
    raise PDFInterpreterError('Unknown operator: %r' % name)
PDFInterpreterError: Unknown operator: '\x00'

我在“for PDFPage.get_page中的页面”行中收到以下错误:

{{1}}

这看起来是您认出的错误吗?我认为问题可能是嵌入在响应中的pdf,而pdfminer没有正确解析。

1 个答案:

答案 0 :(得分:1)

使用

from io import StringIO
file_like = StringIO(your_string)

如果你在py3上,py2也有StringIO,但导入不同。 如果你真的有字节(在你发布的例子中没有b''),有一个类似的BytesIO可供使用。

对于解析pdf,一种方式是pdfminer,如果你在py3上,有一个名为pdfminer-six的版本可以运行。 关于如何使用pdfminer的大量例子。 然而,在实际的PDF格式以及您在pdf中寻找的内容之前,您可能会在以可接受且可重现的方式将其拉出以供以后使用之前获得白发。

如果在pdfminer中找不到流阅读器,它可能会将字符串写入磁盘,然后将您的pdf文件作为pdfminer的起始点放在磁盘上。