Python实现PDF按页分割:灵活拆分文档的技术指南

PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时。本文将介绍如何使用Python创建一个灵活的PDF分割工具,能够根据用户指定的页数范围任意分割文档。

需求分析

从实际案例出发,今天一个朋友给向我求助帮忙,将一份PDF文档(75页),需要将其分割为三个部分:

  • 第1部分:第1页(申请表)
  • 第2部分:第2-9页(身份证明和医疗证明)
  • 第3部分:第10页到最后(费用明细)

这个问题用Python语言开发一个程序轻松搞定。不仅能满足这个特定需求,还能处理任意页数范围的分割。

技术方案

工具选择

  • PyPDF2:轻量级PDF处理库,适合基本PDF操作
  • os:处理文件和目录路径
  • argparse:解析命令行参数

安装依赖

pip install PyPDF2

完整代码实现

import os
import argparse
from PyPDF2 import PdfReader, PdfWriterdef 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 = startranges.append((start, end))return rangesif __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. 分割为三个部分(第1页、第2-9页、第10页到最后):

    python pdf_splitter.py "吉林省镇赉县*.pdf" "1,2-9,10-" -o 分割结果
    
  2. 仅提取特定页面

    # 提取第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-"
    
  3. 提取多个不连续范围

    # 提取封面(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. 自动化处理

    • 与OCR工具集成
    • 批量处理多个文档
    • 定时任务自动分割新文档

扩展建议

  1. 添加GUI界面:使用PyQt或Tkinter创建图形界面
  2. 集成OCR功能:结合pytesseract提取文本内容
  3. 添加水印功能:在分割后的文件添加特定水印
  4. 支持批量处理:处理整个文件夹的PDF文件
  5. 添加PDF压缩:减小输出文件大小

总结

本文介绍了一个灵活、健壮的PDF分割工具,使用Python和PyPDF2库实现。该工具可以:

  • 按任意页数范围分割PDF文档
  • 处理单个页面或多个不连续范围
  • 智能处理到文档末尾的特殊情况
  • 提供清晰的操作反馈和错误处理

通过这个工具,我们可以轻松完成类似教师医疗资助申请文档的分割任务,也能适应各种其他PDF处理需求。代码设计注重灵活性和健壮性,可直接用于生产环境或作为更复杂PDF处理流程的基础模块。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90955.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90955.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/90955.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「iOS」——GCD其他方法详解

GCD学习GCD其他方法dispatch_semaphore &#xff08;信号量&#xff09;**什么是信号量**dispatch_semaphore主要作用dispatch_semaphore主要作用异步转同步设置一个最大开辟的线程数加锁机制dispatch_time_t 两种形式GCD一次性代码(只执行一次)dispatch_barrier_async/sync栅栏…

【图像处理基石】如何实现一个车辆检测算法?

基于AI的车牌检测和识别算法 问题描述、应用场景与难点 问题描述 车牌检测和识别是计算机视觉领域的一个特定任务&#xff0c;主要包含两个核心步骤&#xff1a; 车牌检测&#xff1a;从图像中准确定位车牌的位置和区域车牌识别&#xff1a;对检测到的车牌区域进行字符识别&…

计算机学报 2025年 区块链论文 录用汇总 附pdf下载

计算机学报 Year&#xff1a;2025 2024请看 1 Title: 基于区块链的动态多云多副本数据完整性审计方法研究 Authors: Key words: 区块链&#xff1b;云存储&#xff1b;多云多副本存储&#xff1b;数据完整性审计 Abstract: 随着云计算技术的快速发展和云存储服务的日益…

计算机网络-UDP协议

UDP&#xff08;用户数据报协议&#xff09;是传输层的一种无连接、不可靠、轻量级的协议&#xff0c;适用于对实时性要求高、能容忍少量数据丢失的场景&#xff08;如视频流、DNS查询等&#xff09;。以下是UDP的详细解析&#xff1a;1. UDP的核心特点特性说明无连接通信前无需…

子域名收集和c段查询

子域名收集方法一、sitesite&#xff1a; 要查询的域名可以查到相关网站二、oneforall &#xff08;子域名查找工具&#xff09;下载后解压的文件夹在当前文件夹打开终端然后运行命令 python oneforall.py --target xxxxxxxx&#xff08;这里放你要查的网址&#xff09; run最…

计网-TCP拥塞控制

TCP的拥塞控制&#xff08;Congestion Control&#xff09;是核心机制之一&#xff0c;用于动态调整发送方的数据传输速率&#xff0c;避免网络因过载而出现性能急剧下降&#xff08;如丢包、延迟激增&#xff09;。其核心思想是探测网络可用带宽&#xff0c;并在拥塞发生时主动…

依赖倒置原则 Dependency Inversion Principle - DIP

基本知识 1.依赖倒置原则&#xff08;DIP&#xff09;是面向对象设计&#xff08;OOD&#xff09;中的五个基本原则之一&#xff0c;通常被称为 SOLID 原则中的 D 2.核心思想&#xff1a; 高层模块不应该依赖低层模块&#xff0c;两者都应该依赖抽象。 (High-level modules sho…

原生input添加删除图标类似vue里面移入显示删除[jquery]

<input type"text" id"servicer-search" class"form-control" autocomplete"off" />上面是刚开始的input <div class"servicer-search-box"><input type"text" id"servicer-search" cla…

整理分享 | Photoshop 2025 (v26.5) 安装记录

导语&#xff1a; 最近整理资源时&#xff0c;发现有朋友在找新版 Photoshop。正好手边有 Photoshop 2025年7月的版本&#xff08;v26.5&#xff09;&#xff0c;就记录下来分享给大家&#xff0c;供有需要的朋友参考。关于这个版本&#xff1a;这个 Photoshop v26.5 安装包&am…

【Redis】Redis 数据存储原理和结构

一、Redis 存储结构 1.1 KV结构 Redis 本质上是一个 Key-Value&#xff08;键值对&#xff0c;KV&#xff09;数据库&#xff0c;在它丰富多样的数据结构底层&#xff0c;都基于一种统一的键值对存储结构来进行数据的管理和操作 Redis 使用一个全局的哈希表来管理所有的键值对…

【RAG优化】深度剖析OCR错误,从根源修复RAG应用的识别问题

1. 引言:OCR——RAG系统中的关键问题 当我们将一个包含扫描页面的PDF或一张报告截图扔给RAG系统时,我们期望它能“读懂”里面的内容。这个“读懂”的第一步,就是OCR。然而,OCR过程并非100%准确,它受到图像质量、文字布局、字体、语言等多种因素的影响。 一个看似微不足道…

【第六节】方法与事件处理器

方法与事件处理器 方法处理器 可以用 v-on 指令监听 DOM 事件: <div id="example"> <button v-on:click="greet">Greet</button></div>绑定一个单击事件处理器到一个方法 greet 。下面在 Vue 实例中定义这个方法 var vm=new V…

大语言模型Claude 4简介

Anthropic公司成立于2021年&#xff0c;由一群OpenAI前员工组成。他们最新发布的大语言模型(Large Language Model, LLM) Claude 4系列包括两个版本&#xff1a;Claude Opus 4和Claude Sonnet 4&#xff1a;(1).Claude Sonnet 4&#xff1a;是Claude Sonnet 3.7的升级&#xff…

国产化PDF处理控件Spire.PDF教程:Python 将 PDF 转换为 Markdown (含批量转换示例)

PDF 是数字文档管理的普遍格式&#xff0c;但其固定布局特性限制了在需要灵活编辑、更新或现代工作流集成场景下的应用。相比之下&#xff0c;Markdown&#xff08;.md&#xff09;语法轻量、易读&#xff0c;非常适合网页发布、文档编写和版本控制。 E-iceblue旗下Spire系列产…

PDF转Markdown - Python 实现方案与代码

PDF作为广泛使用的文档格式&#xff0c;转换为轻量级标记语言Markdown后&#xff0c;可无缝集成到技术文档、博客平台和版本控制系统中&#xff0c;提高内容的可编辑性和可访问性。本文将详细介绍如何使用国产Spire.PDF for Python 库将 PDF 文档转换为 Markdown 格式。 技术优…

深度解析 inaSpeechSegmenter:高效音频语音分割与检测开源工具

项目简介 inaSpeechSegmenter 是法国国家视听研究院(INA)开源的音频分割与检测工具,专为广播、播客、采访、影视等多媒体内容的自动化处理设计。它能够高效地将长音频自动分割为语音、音乐、噪声、静音等片段,并支持性别检测(男声/女声),为后续的语音识别、内容检索、转…

VirtualBox安装Ubuntu 22.04后终端无法打开的解决方案

问题现象在VirtualBox中使用"快速安装"模式安装Ubuntu 22.04后图形终端&#xff08;gnome-terminal&#xff09;无法通过图标或快捷键(CtrlAltT)启动系统其他功能正常根本原因语言环境(Locale)配置异常导致&#xff1a;快速安装模式可能跳过Locale生成步骤gnome-term…

java磁盘操作与IO流(序列化、Properties类)

目录 一、磁盘操作 1、File类&#xff1a; &#xff08;1&#xff09;创建File对象&#xff1a; &#xff08;2&#xff09;获取文件信息&#xff1a; &#xff08;3&#xff09;判断文件 &#xff08;4&#xff09;删除文件 &#xff08;5&#xff09;创建文件&#xff…

【WPF】WPF Prism 开发经验总结:菜单命令删除项时报 InvalidCastException 的问题分析与解决

WPF Prism 开发经验总结&#xff1a;菜单命令删除项时报 InvalidCastException 的问题分析与解决 在 WPF Prism 项目中使用 ContextMenu 执行删除操作时&#xff0c;遇到一个令人疑惑的问题&#xff1a;命令绑定本身没有问题&#xff0c;但点击“删除”菜单后&#xff0c;程序抛…

《WebGL打造高性能3D粒子特效系统:从0到1的技术探秘》

在游戏里,爆炸时四溅的火花、魔法释放时闪烁的光晕;在可视化项目中,数据流动时呈现的璀璨光河,这些令人惊叹的效果,背后离不开强大的技术支撑。而WebGL,作为在浏览器端实现硬件加速3D图形渲染的技术,为我们开启了构建高性能3D粒子特效系统的大门。 WebGL的渲染管线是整…