我有一个包含很多子文件夹的文件夹,里面有PDF文件。在这些文件中查找信息真是一团糟,所以我编写了一个程序来解析这些文件夹和文件,在PDF文件中搜索关键字,并返回包含该关键字的PDF文件的名称。
它起作用了。实际上,几乎。
我有这个错误:PyPDF2.errors.PdfReadError: PDF starts with '♣▬', but '%PDF-' expected
当我的程序到达一些文件夹(很难确切地知道哪一个)。从我的角度来看,我文件夹里所有的PDF文件都是一样的,所以我不明白为什么我的程序对一些文件有效,而对另一些文件不起作用。
提前感谢您的回复。
PdfFileReader
已弃用。用PdfReader
代替!(源)
PdfFileReader有一个strict
属性。使用它:
reader = PdfFileReader("example.pdf", strict=False)
PdfReader与PdfFileReader相同,但默认情况下具有strict=False
。大多数人想要strict=False
。在下一个主要版本中,我将从PyPDF2中删除PdfFileReader,以支持PdfReader。
如果您仍然遇到问题,请在Github上打开问题-但前提是您可以共享导致问题的pdf+代码:https://github.com/py-pdf/PyPDF2
免责声明:我是borb
的作者,这个图书馆在这个答案中提到
PDF将(在内部)跟踪文件中对象的所有字节偏移量(例如"object 10从字节10202"开始)。
- 我们从文件的开头开始计数吗?
- 或者在文件像PDF一样的地方开始?
如果您只想从PDF中提取文本(以便能够检查内容和关键字),您可以尝试使用borb
。
borb
将在文件的前1MB内查找PDF的开头(因此可能会忽略错误的头文件)。如果这破坏了XREF(交叉引用表,包含对象的所有字节地址),它将简单地构建一个新的。
这是一个如何使用borb
:
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()
您可以在示例库中找到更多示例。