【发布时间】:2012-07-08 16:06:40
【问题描述】:
我正在尝试使用 PDFMiner python 绑定从大量 PDF 中提取文本。我编写的模块适用于许多 PDF,但对于一部分 PDF,我得到了这个有点神秘的错误:
ipython 堆栈跟踪:
/usr/lib/python2.7/dist-packages/pdfminer/pdfparser.pyc in set_parser(self, parser)
331 break
332 else:
--> 333 raise PDFSyntaxError('No /Root object! - Is this really a PDF?')
334 if self.catalog.get('Type') is not LITERAL_CATALOG:
335 if STRICT:
PDFSyntaxError: No /Root object! - Is this really a PDF?
当然,我立即检查了这些 PDF 是否已损坏,但它们可以正常阅读。
尽管没有根对象,有没有办法阅读这些 PDF?我不太确定从这里去哪里。
非常感谢!
编辑:
我尝试使用 PyPDF 以获得一些差异诊断。堆栈跟踪如下:
In [50]: pdf = pyPdf.PdfFileReader(file(fail, "rb"))
---------------------------------------------------------------------------
PdfReadError Traceback (most recent call last)
/home/louist/Desktop/pdfs/indir/<ipython-input-50-b7171105c81f> in <module>()
----> 1 pdf = pyPdf.PdfFileReader(file(fail, "rb"))
/usr/lib/pymodules/python2.7/pyPdf/pdf.pyc in __init__(self, stream)
372 self.flattenedPages = None
373 self.resolvedObjects = {}
--> 374 self.read(stream)
375 self.stream = stream
376 self._override_encryption = False
/usr/lib/pymodules/python2.7/pyPdf/pdf.pyc in read(self, stream)
708 line = self.readNextEndLine(stream)
709 if line[:5] != "%%EOF":
--> 710 raise utils.PdfReadError, "EOF marker not found"
711
712 # find startxref entry - the location of the xref table
PdfReadError: EOF marker not found
Quonux 建议 PDFMiner 在到达第一个 EOF 字符后停止解析。这似乎暗示了其他情况,但我非常无能为力。有什么想法吗?
【问题讨论】:
-
也许 PDFMiner 在第一个 %%EOF 标签之后终止对根节点的搜索但之后该标签可能会出现更多节点,因此它不会找到它。另一个原因可能是文件被压缩了?
-
@Quonux,我将如何测试是否是这种情况?是否有强制 PDFMiner 在整个文档中搜索根节点的选项?关于压缩的可能性,有没有办法检查这个?如果文件被压缩了怎么办?
-
@Quonux,我使用 pypdf 添加了来自类似尝试的堆栈跟踪。这是否有助于缩小原因?
-
也许解析器需要一个 %%EOF 标签,但没有找到……也许你可以用以下方法修复它: - 打开“不正确”的文件 - 以二进制模式写入/追加 “%%EOF \n" 在文件末尾 - 关闭它 - 尝试再次解析
标签: python pypdf pdf-parsing pdf-manipulation