我建议在 pdf.py 脚本中更改类read()
方法的开头:PdfFileReader
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
在我看来,原始代码并没有真正执行 Adobe 的PDF 1.3 参考文档中第 3.4.4 节“文件预告片”(第 628 页)所暗示的内容(斜体是我的):
Acrobat 查看器只要求%%EOF 标记出现在文件最后 1024 字节的某个位置。
换句话说,在"%%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