Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将非标准PDF与pyPdf合并_Python_Pdf_Python 2.6_Pypdf - Fatal编程技术网

Python 将非标准PDF与pyPdf合并

Python 将非标准PDF与pyPdf合并,python,pdf,python-2.6,pypdf,Python,Pdf,Python 2.6,Pypdf,我想把几个PDF文件合并成一个PDF文档。事实证明,输入文件并不完全符合标准。EOF标记后面是一些附加信息: >> startxref 1994481 %%EOF %%PPIRoute: 4 显然,这会导致pyPdf: 现在的问题是:我该怎么办?我可能会打开每个文件,去掉最后两行并保存,然后再将它们放入pyPdf。然而,我不太喜欢这个想法。也许还有更好的选择?我建议将pdf.py脚本中PdfFileReader类的read()方法的开头改为: def read(self,

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

>>
startxref
1994481
%%EOF

%%PPIRoute: 4
显然,这会导致pyPdf:


现在的问题是:我该怎么办?我可能会打开每个文件,去掉最后两行并保存,然后再将它们放入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
致:

在我看来,原始代码并没有真正实现Adobe文档中第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
def读取(自、流):
#从最后开始
stream.seek(-1,操作系统seek\u END)
last1K=stream.tell()-1024+1#流的最后1024字节的偏移量
#在查看文件结束标记时向后读取流
行=“”
而行[:5]!=“%%EOF”:
line=self.readNextEndLine(流)
如果stream.tell()
派生
PdfileReader
的子类,该子类在其
read()方法中执行所需的操作。或者,创建您自己的智能
stream
对象,并将其传递给现有的
read()
方法。更改
pdf.py
是一个选项吗?修改它似乎很容易解决问题(假设可以删除/忽略文件中的附加信息)。cyroxx:你试过我的答案吗?还没有,因为这是一个小项目,我已经有一段时间没有研究过了。感谢您的回答,我将在尝试您建议的解决方案后立即进行评论/投票。当行为空时,它会显示。。。ValueError:基数为10的int()的文本无效:“%EOF”。以前的代码不会进入循环。有什么想法吗,马提诺?
    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
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