Python使用pypdf按指定页码范围批量拆分PDF

 更新时间:2026年01月04日 14:59:32   作者:weixin_46244623  
在处理电子书,扫描书籍或技术文档时,经常会遇到一个需求,即按照指定页码范围把一个 PDF 拆分成多个 PDF 文件,本文将介绍一种简单、稳定、无需外部依赖的方法,有需要的可以了解下

在处理电子书、扫描书籍或技术文档时,经常会遇到一个需求:

按照指定页码范围,把一个 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的资料请关注脚本之家其它相关文章!

相关文章

  • python3 实现的人人影视网站自动签到

    python3 实现的人人影视网站自动签到

    这里给大家分享的是使用Python3结合计划任务,实现的人人影视网站自动签到功能的代码,非常的实用,有需要的小伙伴可以参考下
    2016-06-06
  • python实现下载文件的三种方法

    python实现下载文件的三种方法

    本篇文章主要介绍了python实现下载文件的三种方法,最常用的方法就是通过Http利用urllib或者urllib2模块还有requests,有兴趣的可以了解一下。
    2017-02-02
  • 使用Python FastAPI构建Web服务的实现

    使用Python FastAPI构建Web服务的实现

    这篇文章主要介绍了使用Python FastAPI构建Web服务的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Python中判断当前操作系统的几种方法

    Python中判断当前操作系统的几种方法

    这篇文章主要为大家详细介绍了Python中判断当前操作系统的三种方法,主要是os.name,sys.platform和platform.system(),下面小编就来和大家详细讲讲具体操作吧
    2025-05-05
  • 由Python运算π的值深入Python中科学计算的实现

    由Python运算π的值深入Python中科学计算的实现

    这篇文章主要介绍了由Python运算π的值深入Python中科学计算的实现,由简单的计算发散出各种算法的讲解,需要的朋友可以参考下
    2015-04-04
  • Matplotlib实现各种条形图绘制

    Matplotlib实现各种条形图绘制

    这篇文章主要介绍了Matplotlib实现各种条形图绘制,文章通过利用 plt.bar 方法实现各种条形图绘制,内容详细具有一定的参考价值,需要的小伙伴可以参考一下
    2022-03-03
  • 利用Python实现颜色色值转换的小工具

    利用Python实现颜色色值转换的小工具

    最近一个朋友说已经转用Zeplin很久了。Zeplin的设计稿展示页面的颜色色值使用十进制的 RGB 表示的,在 Android 中的颜色表示大多情况下都需要十六进制的 RGB 表示。所以想写个工作,当输入十进制的RGB ,得到十六进制的色值,最好可以方便复制。下面来一起看看吧。
    2016-10-10
  • Python基础语法入门之顺序、条件与循环

    Python基础语法入门之顺序、条件与循环

    Python是一种高级、解释型、交互式和面向对象的脚本语言,Python 是一种非常灵活和强大的编程语言,适用于各种类型的应用程序开发,这篇文章主要介绍了Python基础语法入门之顺序、条件与循环的相关资料,需要的朋友可以参考下
    2026-01-01
  • python利用dlib获取人脸的68个landmark

    python利用dlib获取人脸的68个landmark

    这篇文章主要介绍了python利用dlib获取人脸的68个landmark,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • python读取mysql数据绘制条形图

    python读取mysql数据绘制条形图

    这篇文章主要为大家详细介绍了python读取mysql数据绘制条形图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03

最新评论