从单个PDF提取指定页面并保存为独立文件的Python实现求助
问题解决方案
原代码存在的问题
- 未定义
information变量,直接调用会抛出NameError - 逻辑流程错误:没有先收集所有"PAGE START"和"PAGE END"的位置,就尝试提取页面
- 输出文件名不符合需求(要求是
first.pdf、second.pdf这类命名) - 未处理输出文件夹
test的创建,若文件夹不存在会导致保存失败 - 未正确配对"PAGE START"与后续对应的"PAGE END"
修正后的实现代码
from PyPDF2 import PdfReader, PdfWriter import re import os # 创建输出文件夹test,不存在则创建 output_dir = "test" if not os.path.exists(output_dir): os.makedirs(output_dir) # 读取PDF文件 reader = PdfReader("test.pdf") start_key = "PAGE START" end_key = "PAGE END" # 收集所有标记页的页码(PyPDF2中页码从0开始) markers = [] for page_idx in range(len(reader.pages)): page = reader.pages[page_idx] text = page.extract_text() if not text: continue # 检查是否包含起始或结束标记 if re.search(start_key, text): markers.append(("start", page_idx)) elif re.search(end_key, text): markers.append(("end", page_idx)) # 配对起始和结束标记,确保每一个start对应后续第一个end page_ranges = [] current_start = None for marker in markers: if marker[0] == "start": current_start = marker[1] elif marker[0] == "end" and current_start is not None: # 提取的页面是start+1到end-1(不包含标记页) page_ranges.append((current_start + 1, marker[1] - 1)) current_start = None # 按要求提取页面并保存 for idx, (start, end) in enumerate(page_ranges, 1): if start > end: print(f"第{idx}组没有可提取的页面,跳过") continue writer = PdfWriter() # 添加中间的所有页面 for page_idx in range(start, end + 1): writer.add_page(reader.pages[page_idx]) # 命名为first.pdf、second.pdf... output_filename = os.path.join(output_dir, f"{['first', 'second', 'third'][idx-1]}.pdf" if idx <=3 else f"part_{idx}.pdf") # 保存文件 with open(output_filename, "wb") as out_file: writer.write(out_file) print(f"已保存: {output_filename}")
关键说明
- 页码处理:PyPDF2使用0-based索引(即第一页索引为0),代码中已自动处理标记页与提取页的关系,确保不包含"PAGE START"和"PAGE END"所在页面
- 标记配对:自动将每个"PAGE START"与后续第一个"PAGE END"配对,避免跨组错误
- 文件夹处理:自动创建
test文件夹,无需手动提前创建 - 命名规则:前3组按
first.pdf、second.pdf、third.pdf命名,超过3组则用part_4.pdf、part_5.pdf...格式,可根据需求修改命名逻辑 - 文本提取兼容性:如果PDF是扫描件(图片格式),
extract_text()无法提取文本,需要结合OCR工具先识别文本后再处理
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

