10人参与 • 2025-07-24 • Python
pdf文件处理是日常工作中的常见需求,特别是当我们需要将大型pdf文档拆分为多个部分时。本文将介绍如何使用python创建一个灵活的pdf分割工具,能够根据用户指定的页数范围任意分割文档。
从实际案例出发,今天一个朋友给向我求助帮忙,将一份pdf文档(75页),需要将其分割为三个部分:
这个问题用python语言开发一个程序轻松搞定。不仅能满足这个特定需求,还能处理任意页数范围的分割。
pypdf2:轻量级pdf处理库,适合基本pdf操作
os:处理文件和目录路径
argparse:解析命令行参数
pip install pypdf2
import os import argparse from pypdf2 import pdfreader, pdfwriter def split_pdf(input_path, output_folder, ranges): """ 将pdf文件按指定页数范围分割 参数: input_path (str): 输入pdf文件路径 output_folder (str): 输出文件夹路径 ranges (list): 分割范围列表,格式为[(起始页, 结束页), ...] """ # 确保输出文件夹存在 if not os.path.exists(output_folder): os.makedirs(output_folder) # 获取文件名(不含扩展名) file_name = os.path.splitext(os.path.basename(input_path))[0] try: with open(input_path, 'rb') as file: reader = pdfreader(file) total_pages = len(reader.pages) print(f"开始处理: {input_path}") print(f"总页数: {total_pages}") # 处理每个分割范围 for i, (start, end) in enumerate(ranges): # 处理结束页为-1(表示到文档末尾)的情况 if end == -1: end = total_pages # 验证页码范围 if start < 1 or end > total_pages or start > end: print(f"⚠️ 警告: 无效的页码范围 [{start}, {end}],跳过") continue # 创建pdf写入对象 writer = pdfwriter() # 添加指定范围的页面(pypdf2使用0-based索引) for page_num in range(start - 1, end): writer.add_page(reader.pages[page_num]) # 生成输出文件名 part_name = f"{file_name}_part{i+1}_p{start}-{end}.pdf" output_path = os.path.join(output_folder, part_name) # 写入文件 with open(output_path, 'wb') as output_file: writer.write(output_file) print(f"✅ 已创建: {part_name} (页数: {start}-{end})") print(f"分割完成! 文件保存在: {output_folder}") except exception as e: print(f"❌ 处理过程中发生错误: {str(e)}") def parse_ranges(range_str): """ 解析页数范围字符串 参数: range_str (str): 页数范围字符串,格式如 "1,2-9,10-" 返回: list: 解析后的页数范围列表 """ ranges = [] parts = range_str.split(',') for part in parts: if '-' in part: start_end = part.split('-') start = int(start_end[0].strip()) # 处理结束页为空的特殊情况(表示到文档末尾) if start_end[1].strip() == '': end = -1 # 使用-1表示到文档末尾 else: end = int(start_end[1].strip()) else: # 单个页码 start = int(part.strip()) end = start ranges.append((start, end)) return ranges if __name__ == "__main__": # 设置命令行参数解析 parser = argparse.argumentparser( description="pdf文件分割工具 - 按指定页数范围分割pdf文档", formatter_class=argparse.rawtexthelpformatter ) parser.add_argument('input', help='输入pdf文件路径') parser.add_argument('ranges', help='页数范围,格式如 "1,2-9,10-"\n' '示例: "1" - 仅第一页\n' ' "1-5" - 1到5页\n' ' "10-" - 从第10页到文档末尾\n' ' "1,3-5,7-" - 多个范围') parser.add_argument('-o', '--output', default='pdf_split_output', help='输出文件夹 (默认: pdf_split_output)') args = parser.parse_args() # 解析页数范围 try: ranges = parse_ranges(args.ranges) print(f"解析的分割范围: {ranges}") # 执行pdf分割 split_pdf(args.input, args.output, ranges) except valueerror: print("❌ 错误: 页数范围格式无效。请使用格式如 '1,2-9,10-'") except exception as e: print(f"❌ 发生错误: {str(e)}")
python pdf_splitter.py 输入文件.pdf "页数范围" [-o 输出文件夹]
分割为三个部分(第1页、第2-9页、第10页到最后):
python pdf_splitter.py "吉林省镇赉县*.pdf" "1,2-9,10-" -o 分割结果
仅提取特定页面:
# 提取第5页 python pdf_splitter.py input.pdf "5" # 提取第10-15页 python pdf_splitter.py input.pdf "10-15" # 提取从第20页到文档末尾 python pdf_splitter.py input.pdf "20-"
提取多个不连续范围:
# 提取封面(1)、目录(3-4)和正文(6-) python pdf_splitter.py book.pdf "1,3-4,6-"
解析的分割范围: [(1, 1), (2, 9), (10, -1)]
开始处理: 吉林省镇赉县*.pdf
总页数: 75
✅ 已创建: 吉林省镇赉县*_part1_p1-1.pdf (页数: 1-1)
✅ 已创建: 吉林省镇赉县*_part2_p2-9.pdf (页数: 2-9)
✅ 已创建: 吉林省镇赉县*_part3_p10-75.pdf (页数: 10-75)
分割完成! 文件保存在: 分割结果
1.灵活的页数范围解析
2.健壮的错误处理
3.用户友好的输出
4.命令行友好
1.文档预处理
2.工作流程优化
3.自动化处理
添加gui界面:使用pyqt或tkinter创建图形界面
集成ocr功能:结合pytesseract提取文本内容
添加水印功能:在分割后的文件添加特定水印
支持批量处理:处理整个文件夹的pdf文件
添加pdf压缩:减小输出文件大小
本文介绍了一个灵活、健壮的pdf分割工具,使用python和pypdf2库实现。该工具可以:
通过这个工具,我们可以轻松完成类似教师医疗资助申请文档的分割任务,也能适应各种其他pdf处理需求。代码设计注重灵活性和健壮性,可直接用于生产环境或作为更复杂pdf处理流程的基础模块。
到此这篇关于python实现pdf按页分割的技术指南的文章就介绍到这了,更多相关python pdf按页分割内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论