本文介绍如何基于pandas dataframe中定义的页面组合,从原始pdf中精准提取对应页码,自动创建50个命名文件夹,每个文件夹内包含仅含指定页的独立pdf文件。
本文介绍如何基于pandas dataframe中定义的页面组合,从原始pdf中精准提取对应页码,自动创建50个命名文件夹,每个文件夹内包含仅含指定页的独立pdf文件。
在实际文档自动化处理中,常需根据结构化元数据(如日期组合、章节标签等)将一份长PDF按不同逻辑切分为多个子PDF。本文提供一套完整、健壮的Python解决方案,使用 PyPDF2 实现页面级精准提取,并结合 os 模块完成目录结构自动生成。
✅ 核心步骤概览
- 定义页面提取函数:接收输入PDF路径、输出PDF路径及目标页码列表(1-indexed);
- 解析DataFrame中的 file_name 和 file_pages_to_keep 字段;
- 为每一行创建同名文件夹(自动处理空格、逗号、连字符等合法路径字符);
- 将提取后的PDF保存至对应文件夹,文件名与文件夹名一致。
? 完整可运行代码
import os
import pandas as pd
from PyPDF2 import PdfReader, PdfWriter
# 配置参数
pdf_path = "Documents/menu.pdf"
output_root = "output_folders" # 所有生成文件夹的父目录
pdf_summary = pd.read_csv("pdf_summary.csv") # 假设已加载您的DataFrame
def extract_pages(input_pdf, output_pdf, pages):
"""
从input_pdf中提取指定页码(1-indexed),保存为output_pdf
"""
with open(input_pdf, "rb") as file:
reader = PdfReader(file)
writer = PdfWriter()
for page_num in pages:
if 1 <= page_num <= len(reader.pages):
writer.add_page(reader.pages[page_num - 1])
else:
raise ValueError(f"Page {page_num} out of range (PDF has {len(reader.pages)} pages)")
with open(output_pdf, "wb") as output_file:
writer.write(output_file)
# 主执行逻辑
for index, row in pdf_summary.iterrows():
folder_name = str(row['file_name']).strip() # 强制转字符串并去首尾空格
folder_path = os.path.join(output_root, folder_name)
os.makedirs(folder_path, exist_ok=True) # 自动创建嵌套路径(支持中文、特殊符号)
# 解析页码:支持 "1,3"、"1, 3"、" 2 , 4 , 5 " 等多种格式
pages_str = str(row['file_pages_to_keep']).strip()
file_pages_to_keep = [int(p.strip()) for p in pages_str.split(",")]
output_pdf_path = os.path.join(folder_path, f"{folder_name}.pdf")
try:
extract_pages(pdf_path, output_pdf_path, file_pages_to_keep)
print(f"✅ Created: {output_pdf_path} (pages {file_pages_to_keep})")
except Exception as e:
print(f"❌ Failed for '{folder_name}': {e}")⚠️ 关键注意事项
- 页码索引:PyPDF2 使用0-indexed页索引,但本方案对外暴露1-indexed接口(用户按自然页码填写,如 "1,3" 表示第1页和第3页),代码内部自动减1;
- 路径安全:os.makedirs(..., exist_ok=True) 可安全处理重复运行;建议避免 file_name 中含 / : * ? " | 等非法Windows字符(可添加清洗逻辑:re.sub(r'[:"/\|?*]', '_', folder_name));
- 错误防护:extract_pages 函数内置页码范围校验,防止越界读取导致静默失败;
-
依赖安装:执行前请确保已安装 PyPDF2>=3.0.0(推荐最新版):
pip install PyPDF2
? 总结
该方案将结构化业务逻辑(DataFrame中的页面映射关系)与PDF底层操作解耦,具备高复用性——只需修改 pdf_summary 数据源或调整 folder_path 规则,即可适配菜单分发、合同归档、试卷生成等多类场景。最终输出严格遵循预期路径结构:output_folders/{file_name}/{file_name}.pdf,每份PDF仅含指定页面,零冗余、全自动化。


















