Python 将非标准PDF与pyPdf合并
我想把几个PDF文件合并成一个PDF文档。事实证明,输入文件并不完全符合标准。EOF标记后面是一些附加信息: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,
>>
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