未找到 EOF 标记 - 如何在 PyPDF 和 PyPDF2 中修复?

Posted

技术标签:

【中文标题】未找到 EOF 标记 - 如何在 PyPDF 和 PyPDF2 中修复?【英文标题】:EOF marker not found - How to fix in PyPDF and PyPDF2? 【发布时间】:2013-04-16 06:17:26 【问题描述】:

我正在尝试使用 Python 将几个 PDF 文件合并为一个 PDF 文件。我已经尝试过 PyPDF 和 PyPDF2 - 在某些文件上,它们都抛出了同样的错误:

PdfReadError: EOF 标记未找到

这是我的代码 (page_files) 是要组合的 PDF 文件路径列表:

# use pypdf to combine pdf pages
output = PdfFileWriter()
for pf in page_files:
    filestream = file(pf, "rb")
    pdf = PdfFileReader(filestream)            
    for num in range(pdf.getNumPages()):
        output.addPage(pdf.getPage(num))            

# write final file
outputStream = file(pdf_full_path, "wb")
output.write(outputStream)
outputStream.close()

我已经阅读了一些关于该主题的 *** 线程,但没有一个包含有效的解决方案。如果您已经使用 Python 成功组合了 PDF 文件,我很想听听如何。谢谢!

【问题讨论】:

你是否有一个堆栈跟踪告诉哪一行代码导致PdfReadError 被提升?另外,您确定要合并的 PDF 文件格式正确吗? Adobe/Acrobat Reader 可以正常阅读吗? @martineau 好主意 - PDF 文件是由 Docraptor 生成的,而后者又使用 PrinceXML,它引发 htmlEntities 错误,导致这些文档在 PyPDF 中出现意外的 EOF。 我猜这是个好消息。听起来加强脚本中的错误处理以尽可能优雅地处理错误的输入文件可能是个好主意。 稍微不相关的评论 - 因为它是搜索引擎上的早期链接而在此处发布:如果忘记以二进制模式打开读取文件流,则会收到相同的错误。因此,如果您遇到错误并且是 PyPDF 的新用户,请确保您使用 'rb' 打开输入文件以“读取二进制文件”。 @nerburn,你有没有试过这个解决方案codedprojects.wordpress.com/2017/06/09/…我自己也需要一个解决方案,但我现在可以解决错误,稍后再纠正。 【参考方案1】:

是否还有人在寻找合并 pdf 的“列表”:

注意: 使用 glob 获取正确的文件列表。

看看这个:glob module reference

from PyPDF2 import PdfFileMerger, PdfFileReader, PdfFileWriter
import os
import glob

class MergeAllPDF:
    def __init__(self):
        self.mergelist = []

    def create(self, filepath, outpath, outfilename):
        self.outfilname = outfilename
        self.filepath = filepath
        self.outpath = outpath
        self.pdfs = glob.glob(self.filepath)
        self.myrange = len(self.pdfs)

        for _ in range(self.myrange):
            if self.pdfs:
                self.mergelist.append(self.pdfs.pop(0))
        self.merge()

    def merge(self):
        if self.mergelist:
            self.merger = PdfFileMerger()
            for pdf in self.mergelist:
                self.merger.append(open(pdf, 'rb'))  
            self.merger.write(self.outpath + "%s.pdf" % (self.outfilname))
            self.merger.close()
            self.mergelist = []
        else:
            print("mergelist is empty please check your input path")

# example how to use
#update your path here:


inpath = r"C:\Users\F***\Desktop\mergeallpdfs\scan\*.pdf" #here are your single page pdfs stored
outpath = r"C:\Users\F***\Desktop\mergeallpdfs\output\\" #here your merged pdf will be stored

b = MergeAllPDF()
b.create(inpath, outpath, "mergedpdf")

【讨论】:

以上是关于未找到 EOF 标记 - 如何在 PyPDF 和 PyPDF2 中修复?的主要内容,如果未能解决你的问题,请参考以下文章

PyPDF2如何实现按照PDF页码提取后并另存为PDF格式文件?

JSch : channel never closed or EOF 通道未关闭

从文件读取时如何找到EOF

未找到 JSF2.0 标记

通过未标记为 cascade PERSIST 的关系找到了一个新对象

在java中读取二进制文件,直到特定的“%% EOF”标记?