在实际文档处理场景中,经常需要给多个文件夹下的PDF文件统一添加指定页面,比如给所有合同PDF添加封面页、给所有报告PDF添加附录页。借助PyMuPDF库可以快速实现这个需求,无需手动逐个操作。

环境准备
首先需要安装PyMuPDF库,它是基于MuPDF引擎的Python绑定,处理PDF速度快且功能全面。可以通过pip命令安装:
pip install pymupdf
核心实现思路
整个批量处理流程可以分为三个核心步骤:
- 遍历所有目标文件夹,收集需要处理的PDF文件路径
- 读取待添加的指定页面文件,提取页面内容
- 逐个打开目标PDF,在指定位置插入页面并保存
完整实现代码
1. 多文件夹遍历函数
首先实现遍历多个根文件夹,收集所有PDF文件路径的功能:
import os
def get_all_pdf_paths(root_folders):
"""遍历多个根文件夹,返回所有PDF文件的绝对路径列表"""
pdf_paths = []
for root_folder in root_folders:
# 检查根文件夹是否存在
if not os.path.exists(root_folder):
print(f"警告:文件夹 {root_folder} 不存在,已跳过")
continue
# 递归遍历文件夹下的所有文件
for parent, dirnames, filenames in os.walk(root_folder):
for filename in filenames:
# 筛选PDF文件,忽略大小写
if filename.lower().endswith(".pdf"):
pdf_path = os.path.join(parent, filename)
pdf_paths.append(pdf_path)
return pdf_paths
2. 批量添加指定页面函数
接下来实现核心的页面添加逻辑,支持指定插入位置:
import fitz # PyMuPDF的导入名是fitz
def batch_add_page_to_pdfs(pdf_paths, insert_page_path, insert_index=0):
"""
批量给PDF文件添加指定页面
:param pdf_paths: 待处理的PDF文件路径列表
:param insert_page_path: 待插入的页面所在的PDF路径
:param insert_index: 插入位置,0表示插入到第一页,默认为0
"""
# 打开待插入的页面文件,提取第一页作为插入内容
insert_doc = fitz.open(insert_page_path)
insert_page = insert_doc[0] # 取第一页作为待插入页面
# 遍历所有待处理的PDF文件
for pdf_path in pdf_paths:
try:
# 打开目标PDF文件
target_doc = fitz.open(pdf_path)
# 在指定位置插入页面,insert_index不能超过文档总页数
actual_index = min(insert_index, len(target_doc))
target_doc.insert_pdf(insert_doc, from_page=0, to_page=0, start_at=actual_index)
# 保存文件,覆盖原文件,也可以修改为保存为新文件
target_doc.save(pdf_path)
target_doc.close()
print(f"处理成功:{pdf_path}")
except Exception as e:
print(f"处理失败 {pdf_path},错误原因:{str(e)}")
# 关闭插入页面文档
insert_doc.close()
3. 主函数调用示例
最后编写主函数,配置参数并启动处理流程:
if __name__ == "__main__":
# 配置需要遍历的多个根文件夹路径
root_folders = [
r"D:文档文件夹1",
r"D:文档文件夹2",
r"D:文档文件夹3"
]
# 配置待插入的指定页面PDF路径,该PDF的第一页会被插入到目标PDF中
insert_page_path = r"D:文档待插入页面.pdf"
# 配置插入位置,0表示插入到第一页,1表示插入到第二页,以此类推
insert_index = 0
# 获取所有PDF文件路径
all_pdf_paths = get_all_pdf_paths(root_folders)
print(f"共找到 {len(all_pdf_paths)} 个PDF文件待处理")
# 执行批量添加页面操作
if all_pdf_paths:
batch_add_page_to_pdfs(all_pdf_paths, insert_page_path, insert_index)
print("批量处理完成")
else:
print("未找到需要处理的PDF文件")
注意事项
- 插入位置参数
insert_index如果大于目标PDF的总页数,会自动插入到文档末尾 - 默认逻辑是覆盖原文件,如果需要保留原文件,可以修改保存路径,比如在原文件名后加
_new后缀 - 待插入的页面PDF如果有多页,可以修改
insert_pdf方法的from_page和to_page参数,插入多页内容 - 处理前建议先备份原文件,避免处理失败导致文件损坏
常见问题排查
如果遇到PDF文件无法打开的情况,可能是文件被占用或者加密,需要先关闭占用程序,或者先解密PDF文件再处理。如果插入页面后格式错乱,可以检查待插入页面PDF的页面尺寸是否和目标PDF一致,不一致时PyMuPDF会自动适配,但可能出现排版偏移。