pypdf 文本提取在某些 PDF 上引发 IndexError

pypdf text extraction throws IndexError on some PDFs

提问人:sescobar 提问时间:11/10/2023 最后编辑:Martin Thomasescobar 更新时间:11/14/2023 访问量:59

问:

我正在使用 Python (v 3.10.11) 和 pypdf (v 3.17.0) 从多个 PDF 中提取文本。

最近,我遇到了一种特殊类型的文件,我无法从中提取文本,因为库抛出异常。

    File "...\pypdf\_cmap.py", line 481, in type1_alternative
        if words[3] != b"put":
IndexError: list index out of range

前方提供完整代码

这些文件未加密,我能够获取它们的元数据(根据它,文件是使用 TCPDF 创建的)并执行其他操作,但每当我尝试在其其中一个页面上使用该功能时,问题就会出现。extract_text

可以在此处找到不可文本提取的 PDF 示例。

我已经搜索了面临完全相同的问题/异常的人/主题,但我没有找到他们。但是,我认为我可能会遇到 Python 文本提取在某些 pdfPyPDF2 字体读取问题上不起作用的情况

寻找其他选项,我发现 Pypdf2(据我所知它已经被弃用,维护者/开发人员已将精力转移到 pypdf)可以提取文本。

代码示例:

# from pypdf import PdfReader
# from PyPDF2 import PdfReader

reader = PdfReader("example.pdf")
number_of_pages = len(reader.pages)
page = reader.pages[0]
text = page.extract_text()
print(text)

如果我使用 PyPDF2 运行它,我将获得正确的文本:

CÁMARA DE COMERCIO...
...
...

如果我尝试使用 pypdf,我会得到:

Traceback (most recent call last):
    File "...\prueba_pdf\test.py", line 8, in <module>
        text = page.extract_text()
    File "...\prueba_pdf\venv\lib\site-packages\pypdf\_page.py", line 2284, in extract_text
        return self._extract_text(
    File "...\prueba_pdf\venv\lib\site-packages\pypdf\_page.py", line 1903, in _extract_text
        cmaps[f] = build_char_map(f, space_width, obj)
    File "...\prueba_pdf\venv\lib\site-packages\pypdf\_cmap.py", line 29, in build_char_map
        font_subtype, font_halfspace, font_encoding, font_map = build_char_map_from_dict(
    File "...\prueba_pdf\venv\lib\site-packages\pypdf\_cmap.py", line 54, in build_char_map_from_dict
        map_dict, space_code, int_entry = parse_to_unicode(ft, space_code)
    File "...\prueba_pdf\venv\lib\site-packages\pypdf\_cmap.py", line 224, in parse_to_unicode
        return type1_alternative(ft, map_dict, space_code, int_entry)
    File "...\prueba_pdf\venv\lib\site-packages\pypdf\_cmap.py", line 481, in type1_alternative
        if words[3] != b"put":
IndexError: list index out of range

有没有办法让 pypdf 在这种情况下工作?我错过了什么吗?

P.S. 我宁愿继续使用 pypdf,而不是在我的项目中有更多的依赖项。

python pypdf 文本提取

评论

0赞 Martin Thoma 11/11/2023
看起来 pypdf 有一个错误,或者 PDF 以一种我们目前无法处理的方式被破坏。请提交错误报告:github.com/py-pdf/pypdf/issues - 如果可能,请添加导致问题的 PDF。请使用 bug 模板。我们将尝试在下一个版本中修复它:-)
0赞 Martin Thoma 11/11/2023
你绝对应该继续使用pypdf!PyPDF2 已被弃用,文本提取更差(尽管我们在切换到 pypdf 之前对 PyPDF2 进行了重大的显着改进)

答: 暂无答案