在处理电子书、扫描书籍或技术文档时,经常会遇到一个需求:
按照指定页码范围,把一个 pdf 拆分成多个 pdf 文件(例如按章节拆分)
本文将介绍一种简单、稳定、无需外部依赖的方法,使用 python 的 pypdf 库来实现 pdf 的批定页码分割。
一、环境准备
python 版本
python 3.8+(推荐 3.9 / 3.10 / 3.11)
可用以下命令确认:
python --version
安装 pypdf
使用 pip 安装最新版 pypdf:
pip install pypdf
如果你在 linux / macos 上,且存在 python2/3 共存问题,可使用:
pip3 install pypdf
安装完成后测试是否成功:
from pypdf import pdfreader, pdfwriter
print("pypdf installed ok")
二、实现思路说明
关键点解析
- pdfreader:读取原始 pdf
- pdfwriter:创建新的 pdf 文件
- pdf 页码从 0 开始,而我们日常看到的是从 1 开始
- 用户只需定义一个页码范围列表即可完成拆分
适用场景
- 按目录拆书
- 按章节导出
- 按页码人工校正后的分割
三、完整 python 实现代码
from pypdf import pdfreader, pdfwriter
import os
def split_pdf_by_page_ranges(input_pdf, output_folder, ranges):
reader = pdfreader(input_pdf)
# 创建输出目录
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for idx, (start_page, end_page) in enumerate(ranges, 1):
writer = pdfwriter()
# pdf 内部页码从 0 开始,因此要 -1
for page_num in range(start_page - 1, end_page):
if page_num < len(reader.pages):
writer.add_page(reader.pages[page_num])
else:
print(f"warning: page {page_num + 1} out of range.")
output_filename = (
f"{output_folder}/chapter_{idx}_pages_{start_page}-{end_page}.pdf"
)
with open(output_filename, "wb") as output_file:
writer.write(output_file)
print(f"saved {output_filename}")
四、自定义章节页码范围
你只需要定义一个 页码区间列表,格式如下:
# ✏️ 自定义分章节页码(格式:[(开始页, 结束页), ...])
page_ranges = [
(1, 34), # 序
(35, 50), # 第一章
(51, 73), # 第二章
(74, 93), # 第三章
(94, 118), # 第四章
(119, 152), # 第五章
(153, 166), # 第六章
(167, 183), # 第七章
(184, 206), # 第八章
(207, 230), # 第九章
(231, 251), # 第十章
]
注意事项:
- 页码是 pdf 阅读器中看到的页码
- 不需要关心 0 / 1 的问题,代码已处理
- 超出 pdf 总页数会自动提示 warning,不会报错
五、执行拆分
split_pdf_by_page_ranges(
"input.pdf",
"./output_manual_split",
page_ranges
)
执行后目录结构如下:
output_manual_split/
├── chapter_1_pages_1-34.pdf
├── chapter_2_pages_35-50.pdf
├── chapter_3_pages_51-73.pdf
├── ...
└── chapter_11_pages_231-251.pdf
完整代码
from pypdf import pdfreader, pdfwriter
import os
def split_pdf_by_page_ranges(input_pdf, output_folder, ranges):
reader = pdfreader(input_pdf)
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for idx, (start_page, end_page) in enumerate(ranges, 1):
writer = pdfwriter()
# 页码从 0 开始,用户输入通常是从 1 开始
for page_num in range(start_page - 1, end_page):
if page_num < len(reader.pages):
writer.add_page(reader.pages[page_num])
else:
print(f"warning: page {page_num + 1} out of range.")
output_filename = f"{output_folder}/chapter_{idx}_pages_{start_page}-{end_page}.pdf"
with open(output_filename, "wb") as output_file:
writer.write(output_file)
print(f"saved {output_filename}")
# ✏️ 自定义你的分章节页码(格式:[(开始页, 结束页), ...])
page_ranges = [
(1, 34), # 序
(35, 50), # 第一章
(51, 73), # 第二章
(74,93), # 第三章
(94,118), # 第四章
(119,152), # 第五章
(153,166), # 第六章
(167,183), # 第七章
(184,206), # 第八章
(207,230), # 第九章
(231,251), # 第十章
]
# 用法示例
split_pdf_by_page_ranges("input.pdf", "./output_manual_split", page_ranges)
以上就是python使用pypdf按指定页码范围批量拆分pdf的详细内容,更多关于python pypdf拆分pdf的资料请关注代码网其它相关文章!
发表评论