Python提取PDF指定页面为新文件 方法详解
用Python从原PDF中抽取指定几页(如第1、3、5、8页)组成一个新PDF,支持乱序抽取,一键完成。
场景痛点
经常需要从一份长PDF里挑出几页单独发出去,比如只要合同的第1页封面、第3-5页关键条款、第10页报价单。手动操作要打开PDF、逐页另存、再合并,步骤繁琐还容易漏。用Python传入页码列表,几行代码就能把任意页抽出来按你给的顺序组成新文件。
用到的库
pip install PyPDF2
完整代码
# -*- coding: utf-8 -*-
"""
从 PDF 中提取指定页面,组成新的 PDF 文件
"""
from PyPDF2 import PdfReader, PdfWriter
def extract_pages(src_path: str, page_numbers: list, out_path: str) -> None:
"""
抽取指定页面生成新 PDF
:param src_path: 源 PDF 路径
:param page_numbers: 要抽取的页码列表(从 1 开始,可乱序、可重复)
:param out_path: 输出新 PDF 路径
"""
reader = PdfReader(src_path)
total = len(reader.pages)
writer = PdfWriter()
for pno in page_numbers:
if pno < 1 or pno > total:
print(f"页码 {pno} 超出范围(共 {total} 页),跳过")
continue
# PyPDF2 索引从 0 开始,所以减 1
writer.add_page(reader.pages[pno - 1])
with open(out_path, "wb") as f:
writer.write(f)
print(f"已提取 {len(writer.pages)} 页 -> {out_path}")
if __name__ == "__main__":
# 示例:抽取第 1 页、第 3 页、第 5-8 页、第 12 页
pages_to_extract = [1, 3] + list(range(5, 9)) + [12]
extract_pages("source.pdf", pages_to_extract, "selected.pdf")
代码讲解
PdfReader打开源文件,PdfWriter准备写入新文件。- 遍历你给的页码列表,越界的页码直接跳过并打印警告,不会让程序崩溃。
reader.pages[pno - 1]把 1 基页码转成 0 基索引。- 页码列表支持乱序:比如传
[10, 1, 5],新PDF里第1页就是原第10页。 - 也支持重复:传
[1, 1, 1]会得到一份把封面复制三遍的新文件,常用于模板填充场景。
运行结果
当前目录生成 selected.pdf,打开后页数等于你传入的合法页码数量(去重前),顺序和你给的列表完全一致。控制台打印实际抽取了多少页。
注意事项
- 这是页面级复制,不是重新排版,所以字体、图片、矢量都会原样保留。
- 跨页的注释、表单字段不会自动带过来,需要额外字段处理。
- 如果只想要某个连续区间,用
range(起始, 结束+1)生成列表即可。 - 加密文件先
reader.decrypt("密码")。

更新时间:2026-09-14 21:38:43