合并 PDF 文件

新手上路,请多包涵

是否可以使用 Python 合并单独的 PDF 文件?

假设是这样,我需要进一步扩展它。我希望遍历目录中的文件夹并重复此过程。

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

原文由 Btibert3 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 519
2 个回答

使用 Pypdf 或其继承者 PyPDF2

作为 PDF 工具包构建的纯 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-i-o-operation/6773733#6773733
        for input_file in input_files:
            input_streams.append(open(input_file, 'rb'))
        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()
        output_stream.close()

if __name__ == '__main__':
    if sys.platform == "win32":
        import os, msvcrt
        msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
    pdf_cat(sys.argv[1:], sys.stdout)

原文由 Gilles ‘SO- stop being evil’ 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 PyPdf2 s PdfMerger 类。

文件串联

您可以使用 append 方法简单地 连接 文件。

 from PyPDF2 import PdfMerger

pdfs = ['file1.pdf', 'file2.pdf', 'file3.pdf', 'file4.pdf']

merger = PdfMerger()

for pdf in pdfs:
    merger.append(pdf)

merger.write("result.pdf")
merger.close()

如果需要,您可以传递文件句柄而不是文件路径。

文件合并

如果你想要更细粒度的合并控制,有一个 merge PdfMerger 方法,它允许你在输出文件中指定一个插入点,这意味着你可以在任何地方插入页面在文件中。 append 方法可以被认为是 merge 其中插入点是文件的末尾。

例如

merger.merge(2, pdf)

在这里,我们将整个 pdf 插入到输出中,但在第 2 页。

页面范围

如果您希望控制从特定文件追加哪些页面,您可以使用 pages 关键字参数 appendmerge 的传递形式 (start, stop[, step]) (就像常规的 range 函数)。

例如

merger.append(pdf, pages=(0, 3))    # first 3 pages
merger.append(pdf, pages=(0, 6, 2)) # pages 1,3, 5

如果您指定的范围无效,您将得到一个 IndexError

注意: 另外,为避免文件保持打开状态,应在写入合并文件后调用 PdfFileMerger 的关闭方法。这可确保及时关闭所有文件(输入和输出)。遗憾的是 PdfFileMerger 没有作为上下文管理器实现,所以我们可以使用 with 关键字,避免显式关闭调用并获得一些简单的异常安全。

您可能还想查看作为 pypdf2 的一部分提供的 pdfcat 脚本。您可以完全避免编写代码的需要。

PyPdf2 github 还 包含 一些演示合并的示例代码。

PyMuPDF

另一个值得一看的库是 PyMuPdf 。合并同样简单。

从命令行:

 python -m fitz join -o result.pdf file1.pdf file2.pdf file3.pdf

从代码

import fitz

result = fitz.open()

for pdf in ['file1.pdf', 'file2.pdf', 'file3.pdf']:
    with fitz.open(pdf) as mfile:
        result.insertPDF(mfile)

result.save("result.pdf")

有很多选项,在项目 wiki 中有详细说明。

原文由 Paul Rooney 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏