我使用以下标准代码:
# 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文件,我想知道这可能是怎么造成的?
答案 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)
希望有帮助!