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的一部分提供的脚本.您可以完全避免编写代码.
Gil*_*il' 101
作为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)
将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)
是否可以使用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)
假设您不需要保留书签和注释,并且您的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作者。