【发布时间】:2018-12-09 15:07:51
【问题描述】:
我有一个 Python 应用程序,它从公共网站上抓取数百个 PDF 文件,并使用 Python 库 PyPDF2 解析它们
在成功解析的数百个此类文件中,一个文件让我心痛。它有 18 页长。文件名是“bad.pdf”。你可以看到它here。
这是我将解析文档的代码:
$ virtualenv my_env
$ source my_env/bin/activate
(my_env) $ pip install PyPDF2==1.26.0
(my_env) $ python
>>> import PyPDF2
>>> def parse_pdf_doc():
>>> pdfFileObj = open('bad.pdf', 'rb')
>>> pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
>>> for curr_page_num in range(pdfReader.numPages):
>>> print 'curr_page_num = {}'.format(curr_page_num)
>>> pageObj = pdfReader.getPage(curr_page_num)
>>> print '\tPage Retrieved successfully'
>>> page_text = pageObj.extractText()
>>> print '\tText extracted successfully'
当我运行这段代码时,它成功地解析了前九页。但是到了第十页,它就挂了。永远:
>>> parse_pdf_doc()
curr_page_num = 0
Page Retrieved successfully
Text extracted successfully
curr_page_num = 1
Page Retrieved successfully
Text extracted successfully
curr_page_num = 2
Page Retrieved successfully
Text extracted successfully
curr_page_num = 3
Page Retrieved successfully
Text extracted successfully
curr_page_num = 4
Page Retrieved successfully
Text extracted successfully
curr_page_num = 5
Page Retrieved successfully
Text extracted successfully
curr_page_num = 6
Page Retrieved successfully
Text extracted successfully
curr_page_num = 7
Page Retrieved successfully
Text extracted successfully
curr_page_num = 8
Page Retrieved successfully
Text extracted successfully
curr_page_num = 9
Page Retrieved successfully
<... hung here forever ...>
第 10 页有什么问题?让我们在查看器中打开它。哇哦:即使是 Google 文档也无法解析第 10 页。因此,该页面肯定有一些损坏:
但是,我仍然需要 PyPDF 以其他方式抛出异常或失败,而不仅仅是进入无限循环。它扼杀了我的工作流程。我可以做些什么来解决 PDF 文件中这个损坏的页面?
【问题讨论】:
-
尝试为每一页打开
thread。在thread可以传递timeout的参数。 -
(仅供参考)我很难找到这个文件有什么问题...我的手写 pdf 检查器警告提到的对象 #925(超出了外部参照),但我找不到什么对象指的是这个!诸如DataLogics 之类的在线 PDF 检查器很高兴地报告它没有错误。