我的知识记录

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("密码")

Python提取PDF指定页面为新文件 方法详解

标签:

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

上一篇:Python填写PDF表单字段:自动批量填合同

下一篇:Python读取PDF全部图片 一键提取教程