gpt4 book ai didi

python - 使用 pyPdf 合并非标准 PDF

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:13 27 4
gpt4 key购买 nike

我想将几个 PDF 文件合并为一个 PDF 文档。事实证明,输入文件并不完全符合标准。 EOF 标记后跟一些附加信息:

>>
startxref
1994481
%%EOF

%%PPIRoute: 4

显然,这会导致 pyPdf giving me an exception :

pyPdf.utils.PdfReadError: EOF marker not found

现在的问题是:我该怎么办?我可能可以打开每个文件,去掉最后两行并保存,然后再将它们放入 pyPdf。但是,我不太喜欢这个主意。也许有更好的选择?

最佳答案

我建议更改 pdf.py 脚本中 PdfFileReader 类的read()方法的开头:

    def read(self, stream):
# start at the end:
stream.seek(-1, 2)
line = ''
while not line:
line = self.readNextEndLine(stream)
if line[:5] != "%%EOF":
raise utils.PdfReadError, "EOF marker not found"

... etc

到:

    def read(self, stream):
# start at the end:
stream.seek(-1, 2)
line = ''
# read stream backwards while watching for end-of-file marker
while line[:5] != "%%EOF":
line = self.readNextEndLine(stream)

... etc

在我看来,原始代码并没有真正执行 Adob​​e PDF 1.3 Reference 中第 3.4.4 节“文件尾部”(第 628 页)所暗示的内容。记录它说的地方(斜体我的):

Acrobat viewers require only that the %%EOF marker appear somewhere within the last 1024 bytes of the file.

换句话说,在 "%%EOF" 标记之后的文件的物理结尾之前可以有其他内容。我建议的更改尝试适应这一点并使其忽略标记后可能附加到文件末尾的任何其他内容,而不是引发异常(但是它不需要“%%EOF” 如规范所述位于最后 1K 字节中,尽管可以添加对此的检查)。这也意味着您尝试合并的文件实际上可能符合规范。

更新:

这里的版本也要求"%%EOF"标记位于最后 1024 字节内:

def read(self, stream):
# start at the end
stream.seek(-1, os.SEEK_END)
last1K = stream.tell() - 1024 + 1 # offset of last 1024 bytes of stream

# read stream backwards while watching for end-of-file marker
line = ''
while line[:5] != "%%EOF":
line = self.readNextEndLine(stream)
if stream.tell() < last1K:
raise utils.PdfReadError, "EOF marker not found"

... etc

关于python - 使用 pyPdf 合并非标准 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15177587/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com