【问题标题】:Can I make PyPDF2 fail gracefully when the PDF it is parsing is corrupted?当它解析的 PDF 损坏时,我可以让 PyPDF2 优雅地失败吗?
【发布时间】: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 检查器很高兴地报告它没有错误。

标签: python pdf pypdf2


【解决方案1】:

下面的模板将让您了解如何实现这一目标。

from multiprocessing import Process
pdfFileObj = open('bad.pdf', 'rb')
for page in PDFPage.get_pages(pdfFileObj):
                    processTimeout = 20
                    extractTextProcess = Process(target=Function_to_extract_text, args=(pdfObject,page)

还有open你的文件来自with关键字(以节省内存泄漏)

【讨论】:

  • PDFPage 是在哪里定义的?为什么分配了processTimeout 但从未使用过?这个答案似乎有点半生不熟。
  • 是的,它是半生不熟的,或者更确切地说只是一个模板。你已经有了可以实现的代码。
猜你喜欢
  • 1970-01-01
  • 2011-05-07
  • 2017-01-03
  • 2010-10-09
  • 1970-01-01
  • 2017-02-18
  • 2014-05-01
  • 2011-04-14
  • 1970-01-01
相关资源
最近更新 更多