本文介绍如何基于pandas dataframe中定义的页面组合,自动化地从源pdf(如menu.pdf)中提取指定页码,为每一行生成一个专属文件夹及仅含目标页的pdf文件,全程使用pypdf2实现稳健的pdf操作。
本文介绍如何基于pandas dataframe中定义的页面组合,自动化地从源pdf(如menu.pdf)中提取指定页码,为每一行生成一个专属文件夹及仅含目标页的pdf文件,全程使用pypdf2实现稳健的pdf操作。
在文档自动化处理场景中,常需根据业务逻辑(如周几对应菜单页)将一份主PDF按不同页码子集拆分为多个定制化PDF,并为每个子集创建隔离的存储目录。本教程提供一套完整、可复用的Python解决方案,依托 PyPDF2(v3.0+)进行PDF读写,并结合 os 和 pandas 实现路径管理与数据驱动控制。
✅ 核心步骤概览
- 定义安全的页面提取函数(支持1-based页码输入)
- 遍历DataFrame逐行解析页码字符串(如 "1,3" → [1, 3])
- 自动创建同名文件夹(兼容含空格/标点的 file_name)
- 将提取结果保存为
/ .pdf
? 实现代码
import os
import pandas as pd
from PyPDF2 import PdfReader, PdfWriter
# 1. 定义页面提取函数(注意:输入页码为1-based,内部自动转0-based)
def extract_pages(input_pdf: str, output_pdf: str, pages: list):
"""
从input_pdf中提取指定页码(1-based),保存为output_pdf
:param input_pdf: 源PDF路径
:param output_pdf: 输出PDF路径(含文件名)
:param pages: 整数列表,如 [1, 3, 5]
"""
with open(input_pdf, "rb") as f:
reader = PdfReader(f)
writer = PdfWriter()
for p in pages:
if 1 <= p <= len(reader.pages):
writer.add_page(reader.pages[p - 1])
else:
raise ValueError(f"Page {p} out of range (PDF has {len(reader.pages)} pages)")
os.makedirs(os.path.dirname(output_pdf), exist_ok=True)
with open(output_pdf, "wb") as out_f:
writer.write(out_f)
# 2. 主执行逻辑(假设 pdf_summary 已加载,pdf_path 已定义)
pdf_path = "Documents/menu.pdf"
for idx, row in pdf_summary.iterrows():
folder_name = row["file_name"].strip() # 清理首尾空格,提升路径健壮性
folder_path = os.path.join("output_folders", folder_name)
# 解析页码字符串(支持 "1,3"、" 2 , 4 , 6 " 等格式)
try:
pages_to_keep = [int(x.strip()) for x in row["file_pages_to_keep"].split(",")]
except ValueError as e:
raise ValueError(f"Invalid page format in row {idx}: '{row['file_pages_to_keep']}'") from e
output_pdf_path = os.path.join(folder_path, f"{folder_name}.pdf")
# 执行提取
extract_pages(pdf_path, output_pdf_path, pages_to_keep)
print(f"✅ Generated: {output_pdf_path}")⚠️ 关键注意事项
- 页码索引:file_pages_to_keep 列中的页码必须为 1-based(即第一页是 1),代码内部自动转换为 PdfReader 所需的0-based索引;
- 路径安全性:os.makedirs(..., exist_ok=True) 确保并发或重复运行不报错;建议对 folder_name 做简单清洗(如移除 / \ : * ? " | 等非法字符,生产环境可引入 slugify 或正则替换);
- 错误防护:函数内置页码越界校验,避免静默失败;
- 依赖版本:请使用 PyPDF2>=3.0.0(旧版 PyPDF2
? 总结
该方案将数据驱动(DataFrame)与PDF操作解耦,结构清晰、易于调试和扩展。你可进一步增强功能,例如:添加日志记录、支持多线程加速、生成摘要报告(各PDF页数/大小)、或集成进FastAPI/CLI工具中供团队复用。只要 pdf_summary 结构稳定,即可零修改支撑任意规模(50行或5000行)的批量导出任务。


















