使用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没有正确解析。
答案 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的起始点放在磁盘上。