PyPDF2.errors.PdfReadError: PDF starts with '♣▬', but '%PDF-' expected

PyPDF2.errors.PdfReadError: PDF starts with '♣▬', but '%PDF-' expected

我有一个包含很多子文件夹的文件夹,里面有 PDF 文件。在这些文件中查找信息真是一团糟,所以我正在编写一个程序来解析这些文件夹和文件,在PDF文件中搜索关键字,并返回包含关键字的PDF文件的名称。

它正在运行。几乎,实际上。

我有这个错误:PyPDF2.errors.PdfReadError: PDF starts with '♣▬', but '%PDF-' expected 当我的程序到达某些文件夹时(很难知道到底是哪一个)。从我的角度来看,我文件夹中的所有 PDF 文件都是相同的,所以我不明白为什么我的程序可以处理某些文件而不能处理其他文件。

提前感谢您的回复。

免责声明:我是borb的作者,这个答案中提到的图书馆

在野外捕获的 PDF 文档有时会以 non-pdf 字节开头(header 并不是 PDF 规范的一部分)。这可能会导致各种问题。

PDF 将(在内部)跟踪文件中 object 的所有字节偏移量(例如“object 10 从字节 10202 开始”)。这 header 使得更难知道 object 从哪里开始。

  • 我们是否从文件的开头开始计数?
  • 或者在文件行为类似于 PDF 的开头?

如果您只想从 PDF 中提取文本(以便能够检查它的内容和关键字),您可以尝试使用 borb.

borb 将在文件的前 1MB 内查找 PDF 的开头(因此可能会忽略您的错误 header)。如果结果证明这会破坏 XREF(交叉引用 table,包含 objects 的所有字节地址),它将简单地构建一个新的。

这是一个如何使用 borb 从 PDF 中提取文本的示例:

import typing
from borb.pdf.document.document import Document
from borb.pdf.pdf import PDF
from borb.toolkit.text.simple_text_extraction import SimpleTextExtraction


def main():

    # read the Document
    doc: typing.Optional[Document] = None
    l: SimpleTextExtraction = SimpleTextExtraction()
    with open("output.pdf", "rb") as in_file_handle:
        doc = PDF.loads(in_file_handle, [l])

    # check whether we have read a Document
    assert doc is not None

    # print the text on the first Page
    print(l.get_text_for_page(0))


if __name__ == "__main__":
    main()

您可以在 examples repository 中找到更多示例。

PdfFileReader 有一个 strict 属性。使用它:

reader = PdfFileReader("example.pdf", strict=False)

如果您仍然遇到问题,请在 Github 上提出问题 - 但前提是您可以共享导致问题的 pdf+代码:https://github.com/py-pdf/PyPDF2