无法使用PyPDF2打开PDF文件

6
我使用的是Python 3.8.5版本。我想编写一个简短的脚本来连接PDF文件,并从这个Stack Overflow问题进行学习,我尝试使用PyPDF2。不幸的是,即使我都无法创建一个PyPDF2.PdfFileReader实例也会导致程序崩溃。
我的代码如下:
import pathlib
import PyPDF2

pdf_path = pathlib.Path('1.pdf')
with pdf_path.open('rb') as pdf_file:
    reader = PyPDF2.PdfFileReader(pdf_file, strict=False)

当我尝试运行它时,我得到以下回溯信息:

Traceback (most recent call last):
  File "C:\...\pdf\open_pdf.py", line 6, in <module>
    reader = PyPDF2.PdfFileReader(pdf_file, strict=False)
  File "C:\...\.virtualenvs\pdf-j0HnXL2B\lib\site-packages\PyPDF2\pdf.py", line 1084, in __init__
    self.read(stream)
  File "C:\...\.virtualenvs\pdf-j0HnXL2B\lib\site-packages\PyPDF2\pdf.py", line 1883, in read
    stream.seek(-11, 1)
OSError: [Errno 22] Invalid argument

为了帮助复现问题,我创建了一个名为 GitHub 仓库,其中包含上述代码和一个示例 PDF 文件。
我做错了什么?

可能是因为你的PDF文档使用的是比PyPDF2支持的更高版本。我用一个PDF 1.3文档尝试了你的代码,它可以正常工作。而你的PDF文档是1.7版本。 - Mario Camilleri
3个回答

2
似乎您的1.pdf文件未通过验证,可以在此处检查:https://www.pdf-online.com/osa/validate.aspx 我尝试了另一个版本为1.7的pdf文件,它成功了,所以问题不在于pdf版本,而是您的1.pdf文件有问题。

谢谢你的指引。然而,这个PDF是通过我的扫描仪创建的(使用标准的Windows 10扫描应用程序)。我可以在任何其他程序中打开它(Chrome,Foxit等)。我该怎么办?脚本的整个目的是自动化扫描操作。 - Amir Rachum
也许这个链接会有帮助: https://superuser.com/questions/278562/how-can-i-fix-repair-a-corrupted-pdf-file 另外,我在一个在线工具这里中修复了你的文件,并且你的脚本可以正常运行,所以理论上可以编写程序自动修复你的文件。 - GProst

2
你可以通过PyMuPDF实现这一点(在Windows上至少需要使用pip install pymupdf安装)。连接文件的基本模式如下:
import fitz

doc1 = fitz.Document('filename1.pdf')
doc2 = fitz.Document('filename2.pdf')

combined = fitz.Document()  # empty document
combined.insertPDF(doc1)
combined.insertPDF(doc2)
combined.save('combinedfile.pdf')

我测试了你的文件,它确实会在PDF中发出“无效交叉引用结构”的警告,但是仍然可以正常使用。(它创建的文件是有效的PDF-1.4)


-1

代码很好,但您需要减小PDF文件的大小,因为它太大了,难以处理。一个简单的方法是打开PDF文件并按打印,在打印机选择中使用Microsoft Print PDF并使用此文件,这不应影响文件的质量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接