Python拆分PDF按页码 一页一个文件方法
用Python+PyPDF2按页码区间把一个大PDF拆成多个小PDF,支持平均拆分、按指定区间拆分,秒完成。
场景痛点
一个几百页的PDF合同或扫描件,只需要把其中某几页单独抽出来发邮件给客户,或者按章节拆成几个小文件。手动在阅读器里另存为,一页一页导出,既慢又容易漏页。用Python按页码区间自动拆分,几秒钟就能把整本PDF切成你想要的片段。
用到的库
pip install PyPDF2
完整代码
# -*- coding: utf-8 -*-
"""
使用 PyPDF2 按页码拆分 PDF
"""
import os
from PyPDF2 import PdfReader, PdfWriter
def split_by_ranges(src_path: str, ranges: list, out_dir: str = "./split_out") -> None:
"""
按页码区间拆分 PDF
:param src_path: 源 PDF 路径
:param ranges: 区间列表,每个元素是 (起始页, 结束页),页码从 1 开始,包含首尾
:param out_dir: 输出目录
"""
os.makedirs(out_dir, exist_ok=True)
reader = PdfReader(src_path)
total = len(reader.pages)
print(f"源文件共 {total} 页")
for start, end in ranges:
if start < 1 or end > total or start > end:
print(f"区间 ({start}, {end}) 不合法,跳过")
continue
writer = PdfWriter()
# PyPDF2 页码从 0 开始,所以要减 1;切片 end 不包含,所以 end 不减
for page_no in range(start - 1, end):
writer.add_page(reader.pages[page_no])
out_path = os.path.join(out_dir, f"pages_{start}-{end}.pdf")
with open(out_path, "wb") as f:
writer.write(f)
print(f"已生成: {out_path}")
def split_every_page(src_path: str, out_dir: str = "./split_each") -> None:
"""
把 PDF 每一页都单独存成一个文件
"""
os.makedirs(out_dir, exist_ok=True)
reader = PdfReader(src_path)
for i, page in enumerate(reader.pages, start=1):
writer = PdfWriter()
writer.add_page(page)
out_path = os.path.join(out_dir, f"page_{i:03d}.pdf")
with open(out_path, "wb") as f:
writer.write(f)
print(f"已按页拆分完成,共 {len(reader.pages)} 个文件")
if __name__ == "__main__":
src = "big.pdf"
# 拆分 1-5 页、10-20 页、最后 3 页
split_by_ranges(src, [(1, 5), (10, 20), (48, 50)])
# 或者一页一个文件
# split_every_page(src)
代码讲解
PdfReader只读打开源文件,len(reader.pages)拿到总页数。PdfWriter负责写新文件,add_page()把 reader 里的页面对象复制过来。- 关键转换:用户习惯从 1 开始数页码,PyPDF2 内部从 0 开始索引,所以
start-1是起始索引,range(start-1, end)正好覆盖到第 end 页(Python 切片不含右端,end 不用减)。 split_every_page演示一页一文件,文件名用:03d补零,方便后续按文件名排序。
运行结果
在 ./split_out 目录下生成 pages_1-5.pdf、pages_10-20.pdf 等文件,每个文件页数等于区间长度。split_every_page 模式则在 ./split_each 下生成 page_001.pdf、page_002.pdf……
注意事项
- PyPDF2 拆分是页面对象拷贝,不会重新压缩或重排,所以生成速度快、体积和源文件接近。
- 跨页的长图、矢量图形在拆分后依然完整。
- 加密 PDF 需要先
reader.decrypt("密码")再拆分。 - 如果要按书签自动拆分。

更新时间:2026-09-14 21:32:02