合并PDF文件

Bti*_*rt3 97 python pdf file-io

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

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

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

Pau*_*ney 144

较新的PyPdf2库有一个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()
Run Code Online (Sandbox Code Playgroud)

append方法似乎需要一个惰性文件对象.也就是说它不会立即读取文件.它将一直等到merge调用该方法.如果使用范围打开(即PdfMerger),则会将空白页附加到生成的文件,因为此时输入文件已关闭.

如果文件句柄生存期是一个问题,避免这种情况的最简单方法是传递append文件名字符串并允许它处理文件生存期.

merger.merge(2, pdf)
Run Code Online (Sandbox Code Playgroud)

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

  • 对于我必须做的事情(连接 280 个单页 pdf),PyMuPDF 比 PyPDF2 快得多。谢谢! (6认同)
  • PyPDF2 现在也再次维护:-)我刚刚链接到您的答案:https://pypdf2.readthedocs.io/en/latest/user/merging-pdfs.html (2认同)

Gil*_*il' 101

使用Pypdf或其后继者PyPDF2:

作为PDF工具包构建的Pure-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()

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)
Run Code Online (Sandbox Code Playgroud)

  • 现在,https://pypi.python.org/pypi/PyPDF2是PyPDF的后继项目 (18认同)
  • 我必须使用 Python 3.6.8 (Linux) 的 `sys.stdout.buffer` (2认同)

Gio*_* PY 7

合并目录中存在的所有pdf文件

将pdf文件放在目录中。启动程序。您将合并所有pdf文件,得到一个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)
Run Code Online (Sandbox Code Playgroud)

  • 截至 2022 年 12 月,当我尝试运行第二部分中的代码时,我发现 PdfFileMerger 已被弃用。您需要将 PdfFileMerger 替换为 PdfMerger,它就可以正常工作 (2认同)

Mar*_*oma 6

是否可以使用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)
Run Code Online (Sandbox Code Playgroud)


Pat*_*pin 5

假设您不需要保留书签和注释,并且您的PDF未被加密,该pdfrw可以很容易地做到这一点。 cat.py是示例串联脚本,并且subset.py是示例页面子设置脚本。

串联脚本的相关部分-假设inputs是输入文件名列表,并且outfn是输出文件名:

from pdfrw import PdfReader, PdfWriter

writer = PdfWriter()
for inpfn in inputs:
    writer.addpages(PdfReader(inpfn).pages)
writer.write(outfn)
Run Code Online (Sandbox Code Playgroud)

从中可以看出,省略最后一页非常容易,例如:

    writer.addpages(PdfReader(inpfn).pages[:-1])
Run Code Online (Sandbox Code Playgroud)

免责声明:我是第一pdfrw作者。

  • 这个图书馆值得更多的声誉。 (3认同)
  • 这是最稳定的一种。 (2认同)