
本文介绍如何基于pandas dataframe中定义的页码规则,自动为每行记录创建专属文件夹及对应pdf(仅含指定页),全程使用pypdf2实现精准页面提取与目录结构生成。
本文介绍如何基于pandas dataframe中定义的页码规则,自动为每行记录创建专属文件夹及对应pdf(仅含指定页),全程使用pypdf2实现精准页面提取与目录结构生成。
在实际文档处理场景中,常需将一份主PDF(如菜单、手册或报表)按不同业务逻辑拆分为多个子PDF——例如按日期组合(“周一、周三”)、单日(“周五”)等生成定制化交付包。本教程提供一套可复用、健壮且易于扩展的Python解决方案,核心依赖 PyPDF2(推荐 ≥3.0.0 版本)进行PDF读写,并结合 os 和 pandas 完成路径管理与数据驱动流程。
✅ 核心步骤概览
- 定义页面提取函数:接收源PDF路径、目标PDF路径及页码列表,安全提取并保存;
- 遍历DataFrame:逐行解析 file_name 与 file_pages_to_keep 字段;
- 自动创建嵌套目录:以 file_name 命名文件夹(兼容中文、逗号、空格等常见字符);
- 生成目标PDF:文件名与文件夹名一致,内容严格限定为指定页码(注意:PDF页码从1开始计数,代码中自动转为0基索引)。
? 完整实现代码
import os
import pandas as pd
from PyPDF2 import PdfReader, PdfWriter
# 配置参数
pdf_path = "Documents/menu.pdf" # 源PDF路径(需确保存在)
output_root = "output_folders" # 输出根目录(自动创建)
# 步骤1:定义页面提取函数
def extract_pages(input_pdf, output_pdf, pages):
"""
从input_pdf中提取指定页码(1-based),保存为output_pdf
:param input_pdf: 源PDF文件路径
:param output_pdf: 目标PDF文件路径
:param pages: 整数列表,如 [1, 3] 表示提取第1页和第3页
"""
with open(input_pdf, "rb") as f_in:
reader = PdfReader(f_in)
writer = PdfWriter()
for page_num in pages:
if 1 <h3>⚠️ 关键注意事项</h3>
- 页码有效性校验:函数内已加入越界检查,避免因页码超出源PDF总页数导致静默失败;
- 路径安全性:os.makedirs(..., exist_ok=True) 确保并发或多轮运行不报错;建议对 file_name 做基础清洗(如替换 / \ ? * : | " 等Windows非法字符);
- 性能提示:若PDF较大或行数极多(>1000),可考虑复用 PdfReader 实例(避免重复读取),但需注意内存占用;
- 依赖安装:执行前请运行 pip install PyPDF2 pandas;
- 编码兼容性:如 file_pages_to_keep 列含不可见空格或全角逗号,请在 .split() 前统一 .strip() 和 .replace(',', ',')。
✅ 验证与扩展
运行后,你将在 output_folders/ 下看到50个子目录,每个目录包含一个命名规范、内容精确的PDF。如需进一步扩展,可轻松集成:
- 添加水印或页眉页脚(通过 PdfWriter.add_page() 后修改 PageObject);
- 并行化处理(使用 concurrent.futures.ThreadPoolExecutor 加速);
- 输出日志到CSV记录成功/失败状态;
- 支持多源PDF(将 pdf_path 改为按行动态读取)。
该方案兼顾简洁性与工程可靠性,适用于自动化文档分发、测试用例生成、合规报告打包等多种专业场景。










