2

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

>>
startxref
1994481
%%EOF

%%PPIRoute: 4

显然,这导致 pyPdf给了我一个例外

pyPdf.utils.PdfReadError: EOF marker not found

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

4

1 回答 1

3

我建议在 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

在我看来,原始代码并没有真正执行 Adob​​e 的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
于 2013-03-02T19:52:53.440 回答