You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从单个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}")

关键说明

  1. 页码处理:PyPDF2使用0-based索引(即第一页索引为0),代码中已自动处理标记页与提取页的关系,确保不包含"PAGE START"和"PAGE END"所在页面
  2. 标记配对:自动将每个"PAGE START"与后续第一个"PAGE END"配对,避免跨组错误
  3. 文件夹处理:自动创建test文件夹,无需手动提前创建
  4. 命名规则:前3组按first.pdf、second.pdf、third.pdf命名,超过3组则用part_4.pdf、part_5.pdf...格式,可根据需求修改命名逻辑
  5. 文本提取兼容性:如果PDF是扫描件(图片格式),extract_text()无法提取文本,需要结合OCR工具先识别文本后再处理

内容的提问来源于stack exchange,提问作者Learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:16:03