合并非标准PDF文件与pyPd

2024-10-01 07:19:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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

>>
startxref
1994481
%%EOF

%%PPIRoute: 4

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

^{pr2}$

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


Tags: 文件文档标记an信息pdfexceptionme
1条回答
网友
1楼 · 发布于 2024-10-01 07:19:19

我建议在pdf.py文件脚本来自:

    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

收件人:

^{pr2}$

在我看来,原始代码并没有真正做到Adobe的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字节中,尽管可以添加一个检查)。这也意味着你试图合并的文件实际上可能符合规范

更新:

{1024>的最后一个}标记也需要在^ 3个字节内:

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

相关问题 更多 >