在处理 PDF 文件时,合并多个 PDF 文件为一个单一文件或者将某个单一文件插入某个PDF文件是一个常见的需求。Python 提供了多种库来实现这一功能,其中 PyPDF2
是一个非常流行的选择。该库提供了简单易用的接口,包括 merge()
方法,可以将多个 PDF 文件合并成一个文件。
基本概念
- PDF 合并: 将两个或更多的 PDF 文件组合成一个新的 PDF 文件,保留所有原始文件的页面和内容。
- PDF插入:将某个PDF文件插入到PDF文件的指定位置,最终形成一个新的文件。
merge()
方法: 在PyPDF2
中,此方法用于将一个 PDF 文件的内容追加到另一个 PDF 文件中。
环境准备
首先,确保已经安装了 PyPDF2
库。如果尚未安装,可以通过以下命令安装:
pip install PyPDF2
使用示例(1)
下面是使用 PyPDF2
的 merge()
方法合并 PDF 文件的基本示例:
例如某文件夹(本例是practice_files)中有merge1.pdf、merge2.pdf、merge3.pdf这样3个PDF。如下所示:
利用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) # 将合并后的内容写入新文件
运行结果如下:
代码解释
- 导入模块:
from pathlib import Path
: 导入Path
类,用于处理文件路径。from PyPDF2 import PdfMerger
: 导入PdfMerger
类,用于合并 PDF 文件。
- 定义 PDF 文件目录:
pdf_dirs = Path.cwd() / 'practice_files'
: 使用Path.cwd()
获取当前工作目录,并与'practice_files'
连接,构建包含待合并 PDF 文件的目录路径。
- 查找 PDF 文件:
pdf_files = list(pdf_dirs.glob('mer*.pdf'))
: 使用glob
方法查找该目录下所有以'mer'
开头且以.pdf
结尾的文件。返回的是一个生成器,所以需要将其转换为列表。
- 排序文件:
pdf_files.sort()
: 对找到的 PDF 文件进行排序。这会按字母顺序排列,但如果文件名中包含数字(如mer1.pdf
,mer10.pdf
),则可能不符合预期的数值顺序。如果需要按数值顺序进行更复杂的排序,可以使用自定义排序函数。
- 创建 PDF 合并器:
pdf_merger = PdfMerger()
: 实例化一个PdfMerger
对象,以便在后续步骤中合并 PDF 文件。
- 合并文件:
for pdf_file in pdf_files[:2]
: 迭代排序后的 PDF 文件列表,但仅限于前两个文件。pdf_merger.append(pdf_file)
: 将当前 PDF 文件添加到PdfMerger
对象中供合并。
- 写入合并结果:
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)
运行结果如下:
代码解释
- 导入模块:
from pathlib import Path
: 导入Path
类,以便处理路径。from PyPDF2 import PdfMerger
: 导入PdfMerger
类,用于合并 PDF 文件。
- 创建合并器:
pdf_merger = PdfMerger()
: 实例化一个PdfMerger
对象,准备对 PDF 文件进行合并操作。
- 定义输出路径:
pdf_path = Path.home().joinpath('concatenated.pdf')
: 创建一个包含合并后 PDF 文件路径的对象,指向用户主目录下的concatenated.pdf
。
- 查找 PDF 文件:
pdf_lst = list(Path.cwd().glob('mer*.pdf'))
: 使用glob
方法获取当前工作目录下所有以'mer'
开头的 PDF 文件,并将其转换为列表。pdf_lst.sort()
: 对找到的 PDF 文件按字母顺序进行排序。
- 添加文件到合并器:
pdf_merger.append(str(pdf_path))
: 将之前定义的concatenated.pdf
文件路径添加到 PDF 合并器中。由于该文件可能已经存在,这一行的作用可能是将其作为已有的合并基础。
- 合并另一个 PDF 文件:
pdf_merger.merge(1, pdf_lst[2])
: 将pdf_lst
列表中的第三个 PDF 文件(由于索引从零开始,所以是pdf_lst[2]
)合并到第一个位置之后(位置索引为 1)。这意味着合并操作将在已经存在的内容之后添加新的页面。
- 写入新的合并文件:
with Path.cwd().joinpath('mer1.pdf').open('wb') as f
: 在当前工作目录下创建一个名为mer1.pdf
的新 PDF 文件,并以二进制写入模式打开它。pdf_merger.write(f)
: 将合并后的 PDF 内容写入到新创建的mer1.pdf
文件中。
小结
此段代码实现的功能是:
- 查找当前工作目录下所有以
'mer'
开头的 PDF 文件,并按字母顺序排列。 - 将用户主目录下的
concatenated.pdf
文件添加到 PDF 合并器中。 - 从先前获得的列表中合并第三个 PDF 文件(
pdf_lst[2]
),插入到合并的内容后面。 - 最后将合并的结果保存为
mer1.pdf
到当前工作目录。
需要注意的是,在执行 merge()
方法时,合并的顺序和目标插入位置 (1) 可能会影响最终生成的 PDF 文件的内容顺序。
注意事项
- 合并的 PDF 文件必须存在,并且路径需正确。
- 合并时可以选择合并特定的页面(如第 n 页)或者合并整个文件。
- 合并后的文件通常会包含所有添加的页面,并按顺序排列。
使用 PyPDF2
库的 merge()
操作可以方便快捷地将多个 PDF 文件合并为一个文件。此功能在文档处理、报告生成等工作中十分实用。通过简单的代码,就可以实现复杂的 PDF 文件操作,为开发者节省大量时间与精力。
欢迎点赞、关注、转发!!!