合并PDF文件

我做了一个search,似乎没有任何事情似乎直接与这个问题有关。 是否有可能使用Python来合并单独的PDF文件?

假设如此,我需要进一步扩展这一点。 我希望循环通过目录中的文件夹并重复此过程。

我可能会推动我的运气,但是可以排除PDF中包含的页面(我的报告生成总是会创build一个额外的空白页面)。

使用Pypdf或其后继PyPDF2 :

作为PDF工具包构build的纯Python库。 它能够:
*逐页分割文件,
*逐页合并文件,

(以及更多)

这是一个适用于这两个版本的示例程序。

#!/usr/bin/env python import sys try: from PyPDF2 import PdfFileReader, PdfFileWriter except ImportError: from pyPdf import PdfFileReader, PdfFileWriter def pdf_cat(input_files, output_stream): input_streams = [] try: # First open all the files, then produce the output file, and # finally close the input files. This is necessary because # the data isn't read from the input files until the write # operation. Thanks to # https://stackoverflow.com/questions/6773631/problem-with-closing-python-pypdf-writing-getting-a-valueerror-io-operation/6773733#6773733 for input_file in input_files: input_streams.append(open(input_file)) writer = PdfFileWriter() for reader in map(PdfFileReader, input_streams): for n in range(reader.getNumPages()): writer.addPage(reader.getPage(n)) writer.write(output_stream) finally: for f in input_streams: f.close() if __name__ == '__main__': pdf_cat(sys.argv[1:], sys.stdout) 

较新的PyPdf2库有一个PdfMerger类,可以这样使用。

例:

 from PyPDF2 import PdfFileMerger pdfs = ['file1.pdf', 'file2.pdf', 'file3.pdf', 'file4.pdf'] merger = PdfFileMerger() for pdf in pdfs: merger.append(open(pdf, 'rb')) with open('result.pdf', 'wb') as fout: merger.write(fout) 

append方法似乎需要一个懒惰的文件对象。 也就是说它不会立即读取文件。 它似乎等到write方法被调用。 如果使用作用域打开(即with ),则会将空白页添加到结果文件中,因为input文件在该点处closures。

如果文件句柄的生命周期是一个问题,避免这种最简单的方法是传递append文件名string,并允许它处理文件的生命周期。

 from PyPDF2 import PdfFileMerger pdfs = ['file1.pdf', 'file2.pdf', 'file3.pdf', 'file4.pdf'] merger = PdfFileMerger() for pdf in pdfs: merger.append(pdf) merger.write("result.pdf") 

你必须使用Python吗? 如果您只需要合并您的PDF,我会看看pdftk

是否有可能使用Python来合并单独的PDF文件?

是。

以下示例将一个文件夹中的所有文件合并到一个新的PDF文件中:

 #!/usr/bin/env python # -*- coding: utf-8 -*- from argparse import ArgumentParser from glob import glob from pyPdf import PdfFileReader, PdfFileWriter import os def merge(path, output_filename): output = PdfFileWriter() for pdffile in glob(path + os.sep + '*.pdf'): if pdffile == output_filename: continue print("Parse '%s'" % pdffile) document = PdfFileReader(open(pdffile, 'rb')) for i in range(document.getNumPages()): output.addPage(document.getPage(i)) print("Start writing '%s'" % output_filename) with open(output_filename, "wb") as f: output.write(f) if __name__ == "__main__": parser = ArgumentParser() # Add more options if you like parser.add_argument("-o", "--output", dest="output_filename", default="merged.pdf", help="write merged PDF to FILE", metavar="FILE") parser.add_argument("-p", "--path", dest="path", default=".", help="path of source PDF files") args = parser.parse_args() merge(args.path, args.output_filename) 

在这里, http://pieceofpy.com/2009/03/05/concatenating-pdf-with-python/给出了一个解决scheme。;

类似的:

 from pyPdf import PdfFileWriter, PdfFileReader def append_pdf(input,output): [output.addPage(input.getPage(page_num)) for page_num in range(input.numPages)] output = PdfFileWriter() append_pdf(PdfFileReader(file("C:\\sample.pdf","rb")),output) append_pdf(PdfFileReader(file("c:\\sample1.pdf","rb")),output) append_pdf(PdfFileReader(file("c:\\sample2.pdf","rb")),output) append_pdf(PdfFileReader(file("c:\\sample3.pdf","rb")),output) output.write(file("c:\\combined.pdf","wb")) 

pdfrw库可以很容易地做到这一点,假设您不需要保存书签和注释,并且您的PDF不encryption。 cat.py是一个示例级联脚本, subset.py是一个示例页面子集脚本。

连接脚本的相关部分 – 假定inputs是input文件名列表, outfn是输出文件名:

 from pdfrw import PdfReader, PdfWriter writer = PdfWriter() for inpfn in inputs: writer.addpages(PdfReader(inpfn).pages) writer.write(outfn) 

正如你所看到的,离开最后一页很容易,例如:

  writer.addpages(PdfReader(inpfn).pages[:-1]) 

免责声明:我是pdfrw的主要作者。

合并目录中的所有pdf文件

如果你喜欢我,经常在一个话题上做一两页,你可能想要把它们很容易地合并,而不必把单个文件放在一个列表中(因为你只有那个目录下的文件,统一的名字),你可以使用这个(修改鲁尼代码)。

 import os from PyPDF2 import PdfFileMerger x = [a for a in os.listdir() if a.endswith(".pdf")] merger = PdfFileMerger() for pdf in x: merger.append(open(pdf, 'rb')) with open("result.pdf", "wb") as fout: merger.write(fout)