在处理 PDF 文件时,合并多个 PDF 文件为一个单一文件或者将某个单一文件插入某个PDF文件是一个常见的需求。Python 提供了多种库来实现这一功能,其中 PyPDF2 是一个非常流行的选择。该库提供了简单易用的接口,包括 merge() 方法,可以将多个 PDF 文件合并成一个文件。

基本概念

  • PDF 合并: 将两个或更多的 PDF 文件组合成一个新的 PDF 文件,保留所有原始文件的页面和内容。
  • PDF插入:将某个PDF文件插入到PDF文件的指定位置,最终形成一个新的文件。
  • merge() 方法: 在 PyPDF2 中,此方法用于将一个 PDF 文件的内容追加到另一个 PDF 文件中。

环境准备

首先,确保已经安装了 PyPDF2 库。如果尚未安装,可以通过以下命令安装:

pip install PyPDF2

使用示例(1)

下面是使用 PyPDF2merge() 方法合并 PDF 文件的基本示例:

例如某文件夹(本例是practice_files)中有merge1.pdf、merge2.pdf、merge3.pdf这样3个PDF。如下所示:

Python对PDF文件的合并操作-LMLPHP

Python对PDF文件的合并操作-LMLPHP

Python对PDF文件的合并操作-LMLPHP

利用PdfMerger实例通过.append()方法将merge1.pdf和merge2.pdf拼接到一起。将拼接后的PDF保存为home目录中的concatenated.pdf文件。

from pathlib import Path
from PyPDF2 import PdfMerger

# 定义 PDF 文件所在的目录路径,使用当前工作目录下的 'practice_files' 文件夹
pdf_dirs = Path.cwd() / 'practice_files'

# 使用 glob 方法查找以 'mer' 开头并以 '.pdf' 结尾的所有 PDF 文件
pdf_files = list(pdf_dirs.glob('mer*.pdf'))  

# 将文件列表按数字顺序排列
pdf_files.sort() 

# 创建一个 PdfMerger 对象,用于合并 PDF 文件
pdf_merger = PdfMerger()

# 遍历排序后的 PDF 文件列表,最多合并前两个文件
for pdf_file in pdf_files[:2]:  # 只处理前两个文件
    pdf_merger.append(pdf_file)  # 将每个 PDF 文件添加到合并器中

# 在用户主目录下创建一个新的 PDF 文件 'concatenated.pdf',以写入模式打开
with Path.home().joinpath('concatenated.pdf').open('wb') as f:
    pdf_merger.write(f)  # 将合并后的内容写入新文件

运行结果如下:

Python对PDF文件的合并操作-LMLPHP

代码解释

  1. 导入模块:
    • from pathlib import Path: 导入 Path 类,用于处理文件路径。
    • from PyPDF2 import PdfMerger: 导入 PdfMerger 类,用于合并 PDF 文件。
  2. 定义 PDF 文件目录:
    • pdf_dirs = Path.cwd() / 'practice_files': 使用 Path.cwd() 获取当前工作目录,并与 'practice_files' 连接,构建包含待合并 PDF 文件的目录路径。
  3. 查找 PDF 文件:
    • pdf_files = list(pdf_dirs.glob('mer*.pdf')): 使用 glob 方法查找该目录下所有以 'mer' 开头且以 .pdf 结尾的文件。返回的是一个生成器,所以需要将其转换为列表。
  4. 排序文件:
    • pdf_files.sort(): 对找到的 PDF 文件进行排序。这会按字母顺序排列,但如果文件名中包含数字(如 mer1.pdf, mer10.pdf),则可能不符合预期的数值顺序。如果需要按数值顺序进行更复杂的排序,可以使用自定义排序函数。
  5. 创建 PDF 合并器:
    • pdf_merger = PdfMerger(): 实例化一个 PdfMerger 对象,以便在后续步骤中合并 PDF 文件。
  6. 合并文件:
    • for pdf_file in pdf_files[:2]: 迭代排序后的 PDF 文件列表,但仅限于前两个文件。
    • pdf_merger.append(pdf_file): 将当前 PDF 文件添加到 PdfMerger 对象中供合并。
  7. 写入合并结果:
    • with Path.home().joinpath('concatenated.pdf').open('wb') as f: 创建一个新的文件路径,位于用户的主目录中,文件名为 concatenated.pdf,以二进制写入模式打开。
    • pdf_merger.write(f): 将合并后的 PDF 内容写入到打开的文件对象 f 中。

小结

这段代码的整体功能是从当前工作目录下的 practice_files 文件夹中查找以 'mer' 开头的 PDF 文件,按顺序排序,然后合并前两个文件,并将合并后的结果保存为 concatenated.pdf 到用户的主目录下。

使用示例(2)

创建一个新的PdfMerger实例,使用.merge()方法将merge3.pdf插入到示例(1)中的concatenated.pdf文件的两页之间。将新的文件保存为home目录中的merged.pdf,最终应该得到一个有3页的PDF。第1页数字1,第2页数字2,第3页数字3。

代码如下:

from pathlib import Path
from PyPDF2 import PdfMerger

# 创建 PdfMerger 对象,用于合并 PDF 文件
pdf_merger = PdfMerger()

# 定义合并后的 PDF 文件路径,位置在用户的主目录下,文件名为 'concatenated.pdf'
pdf_path = Path.home().joinpath('concatenated.pdf')

# 获取当前工作目录下所有以 'mer' 开头的 PDF 文件,并将其转换为列表
pdf_lst = list(Path.cwd().glob('mer*.pdf'))
# 对列表进行排序
pdf_lst.sort()

# 将已存在的 'concatenated.pdf' 文件添加到合并器中
pdf_merger.append(str(pdf_path))

# 在现有的合并结果后,将 pdf_lst 列表中的第三个 PDF 文件(索引为 2)合并进来
pdf_merger.merge(1, pdf_lst[2])

# 在当前工作目录下创建一个新的 PDF 文件 'mer1.pdf',以写入模式打开
with Path.cwd().joinpath('mer1.pdf').open('wb') as f:
    # 将合并后的内容写入到新创建的文件中
    pdf_merger.write(f)

运行结果如下:
Python对PDF文件的合并操作-LMLPHP

代码解释

  1. 导入模块:
    • from pathlib import Path: 导入 Path 类,以便处理路径。
    • from PyPDF2 import PdfMerger: 导入 PdfMerger 类,用于合并 PDF 文件。
  2. 创建合并器:
    • pdf_merger = PdfMerger(): 实例化一个 PdfMerger 对象,准备对 PDF 文件进行合并操作。
  3. 定义输出路径:
    • pdf_path = Path.home().joinpath('concatenated.pdf'): 创建一个包含合并后 PDF 文件路径的对象,指向用户主目录下的 concatenated.pdf
  4. 查找 PDF 文件:
    • pdf_lst = list(Path.cwd().glob('mer*.pdf')): 使用 glob 方法获取当前工作目录下所有以 'mer' 开头的 PDF 文件,并将其转换为列表。
    • pdf_lst.sort(): 对找到的 PDF 文件按字母顺序进行排序。
  5. 添加文件到合并器:
    • pdf_merger.append(str(pdf_path)): 将之前定义的 concatenated.pdf 文件路径添加到 PDF 合并器中。由于该文件可能已经存在,这一行的作用可能是将其作为已有的合并基础。
  6. 合并另一个 PDF 文件:
    • pdf_merger.merge(1, pdf_lst[2]): 将 pdf_lst 列表中的第三个 PDF 文件(由于索引从零开始,所以是 pdf_lst[2])合并到第一个位置之后(位置索引为 1)。这意味着合并操作将在已经存在的内容之后添加新的页面。
  7. 写入新的合并文件:
    • with Path.cwd().joinpath('mer1.pdf').open('wb') as f: 在当前工作目录下创建一个名为 mer1.pdf 的新 PDF 文件,并以二进制写入模式打开它。
    • pdf_merger.write(f): 将合并后的 PDF 内容写入到新创建的 mer1.pdf 文件中。

小结

此段代码实现的功能是:

  1. 查找当前工作目录下所有以 'mer' 开头的 PDF 文件,并按字母顺序排列。
  2. 将用户主目录下的 concatenated.pdf 文件添加到 PDF 合并器中。
  3. 从先前获得的列表中合并第三个 PDF 文件(pdf_lst[2]),插入到合并的内容后面。
  4. 最后将合并的结果保存为 mer1.pdf 到当前工作目录。

需要注意的是,在执行 merge() 方法时,合并的顺序和目标插入位置 (1) 可能会影响最终生成的 PDF 文件的内容顺序。

注意事项

  • 合并的 PDF 文件必须存在,并且路径需正确。
  • 合并时可以选择合并特定的页面(如第 n 页)或者合并整个文件。
  • 合并后的文件通常会包含所有添加的页面,并按顺序排列。

使用 PyPDF2 库的 merge() 操作可以方便快捷地将多个 PDF 文件合并为一个文件。此功能在文档处理、报告生成等工作中十分实用。通过简单的代码,就可以实现复杂的 PDF 文件操作,为开发者节省大量时间与精力。

欢迎点赞、关注、转发!!!

10-10 13:00