合并2个pdf文件给我一个空的pdf

时间:2018-04-19 17:55:39

标签: python pdf

我使用以下标准代码:

# importing required modules
import PyPDF2

def PDFmerge(pdfs, output):
    # creating pdf file merger object
    pdfMerger = PyPDF2.PdfFileMerger()

    # appending pdfs one by one
    for pdf in pdfs:
        with open(pdf, 'rb') as f:
            pdfMerger.append(f)

    # writing combined pdf to output pdf file
    with open(output, 'wb') as f:
        pdfMerger.write(f)

def main():
    # pdf files to merge
    pdfs = ['example.pdf', 'rotated_example.pdf']

    # output pdf file name
    output  = 'combined_example.pdf'

    # calling pdf merge function
    PDFmerge(pdfs = pdfs, output = output)

if __name__ == "__main__":
    # calling the main function
    main()

但是当我用我的2个pdf文件(只包含一些文本)调用它时,它会生成一个空的pdf文件,我想知道这可能是怎么造成的?

2 个答案:

答案 0 :(得分:2)

问题是您要在write之前关闭文件。

当你致电pdfMerger.append时,它实际上并没有读取和处理整个文件;只有在你致电pdfMerger.write时才会这样做。由于您附加的文件已关闭,因此它不会从每个文件中读取数据,因此会输出一个空PDF。

这实际上应该引发异常,这会使问题和解决方案显而易见。显然这是a bug introduced in version 1.26,它将在下一个版本中修复。不幸的是,虽然修复程序已于2016年7月实施,但自2016年5月以来还没有下一个版本。(请参阅this issue。)

你可以直接从github master安装(希望没有任何新的bug),或者你可以继续等待1.27,或者你可以解决这个bug。怎么样?简单:只需保持文件打开,直到write完成:

with contextlib.ExitStack() as stack:
    pdfMerger = PyPDF2.PdfFileMerger()
    files = [stack.enter_context(open(pdf, 'rb')) for pdf in pdfs]
    for f in files:
        pdfMerger.append(f)
    with open(output, 'wb') as f:
        pdfMerger.write(f)

答案 1 :(得分:1)

我发现有效的解决方法是使用PdfFileReader的实例作为要附加的对象。

merger = PdfFileMerger()
for f in ['file1.pdf', 'file2.pdf', 'file3.pdf']:
    merger.append(PdfFileReader(f), 'rb')
with open('finished_copy.pdf', 'wb') as new_file:
    merger.write(new_file)

希望有帮助!