【问题标题】:Is there a faster way to merge two files rather than page by page?有没有更快的方法来合并两个文件而不是逐页合并?
【发布时间】:2020-04-29 15:30:05
【问题描述】:

我在 Python 3 上,使用 PyPDF2,为了将页码添加到新生成的 PDF(我使用 reportlab),我按以下方式逐页合并两个 PDF 文件:

from PyPDF2 import PdfFileWriter, PdfFileReader

def merge_pdf_files(first_pdf_fp, second_pdf_fp, target_fp):
    """
    Merges two PDF files into a target final PDF file.

    Args:
        first_pdf_fp: the first PDF file path.
        second_pdf_fp: the second PDF file path.
        target_fp: the target PDF file path.
    """
    pdf1 = PdfFileReader(first_pdf_fp)
    pdf2 = PdfFileReader(second_pdf_fp)
    assert (pdf1.getNumPages() == pdf2.getNumPages())
    final_pdf_writer = PdfFileWriter()
    for i in range(pdf1.getNumPages()):
        number_page = pdf1.getPage(i)
        content_page = pdf2.getPage(i)
        content_page.mergePage(number_page)
        final_pdf_writer.addPage(content_page)
    with open(target_fp, "wb") as final_os:
        final_pdf_writer.write(final_os)

但这很慢。使用PyPDF2 一次合并是否有更快、更简洁的方法?

【问题讨论】:

    标签: python pypdf2


    【解决方案1】:

    我没有足够的“声誉”来发表评论。但是因为我要发布一个答案,所以我做了很长时间。

    通常,当人们想要“合并”文档时,他们的意思是“组合”它们,或者正如您所指出的,将一个 pdf 连接或附加到另一个 pdf 的末尾(或介于两者之间)。但是根据您提供的代码,您似乎是指将一个 pdf 覆盖在另一个上,对吗?或者换句话说,您希望将 pdf1 和 pdf2 中的第 1 页合并到一个页面中,作为新 pdf 的一部分。

    如果是这样,您可以使用它(修改自用于说明水印的示例)。 它仍然一次覆盖一页。但是,与 PyPDF2 相比,众所周知 pdfrw 速度非常快,并且应该可以与 reportlab 很好地配合使用。我没有比较速度,所以不确定这是否真的会比你已经拥有的更快

    from pdfrw import PdfReader, PdfWriter, PageMerge
    
    p1 = pdfrw.PdfReader("file1")
    p2 = pdfrw.PdfReader("file2")
    
    for page in range(len(p1.pages)):
        merger = PageMerge(p1.pages[page])
        merger.add(p2.pages[page]).render()
    
    writer = PdfWriter()
    writer.write("output.pdf", p1)
    

    【讨论】:

      【解决方案2】:

      试试这个。 您可以使用PyPdf2s PdfMerger 类。

      使用文件连接,你可以使用追加方法连接文件

      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")
      merger.close()
      

      【讨论】:

      • 这不是合并文件,而是一个接一个地追加。
      • 如果你想要更细粒度的合并控制,有一个 PdfMerger 的合并方法,它允许你在输出文件中指定一个插入点,这意味着你可以在文件的任何地方插入页面。 append 方法可以被认为是插入点是文件末尾的合并。例如merge.merge(2, pdf) 这里我们将整个 pdf 插入到输出中,但在第 2 页。
      • 注意:为了避免文件被打开,PdfFileMergers close 方法应该在合并文件被写入时被调用。这可确保所有文件都及时关闭(输入和输出)。遗憾的是 PdfFileMerger 没有实现为上下文管理器,因此我们可以使用 with 关键字,避免显式关闭调用并获得一些简单的异常安全性。您可能还想查看作为 pypdf2 的一部分提供的 pdfcat 脚本。您可以完全避免编写代码的需要。 PyPdf2 github 还包含一些演示合并的示例代码。
      【解决方案3】:

      也许答案会在Is there a way to speed up PDF page merging... 对您有所帮助,其中使用 multiprocessing 需要 100% 的处理器

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-25
        • 1970-01-01
        • 2019-08-11
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-29
        相关资源
        最近更新 更多