Python3 模块精讲|PyPDF2 万字实战:PDF 读写、拆分、合并、加水印一站式搞定

文章标签:#Python #PyPDF2 #PDF 处理 #办公自动化 #Python 实战

📝 本章学习目标:本章聚焦 Python 办公自动化高频场景,帮助读者从零到一完全掌握PyPDF2模块的读取、写入、合并、拆分、页面操作、加水印、加密解密等全套能力。通过本章学习,你将能独立完成企业级 PDF 自动化任务,告别手动处理 PDF,大幅提升办公效率。


一、引言:为什么 PyPDF2 是办公必备神器

在报告导出、合同管理、资料整理、批量打印、电子书处理等场景中,PDF 操作是每天都要面对的工作。手动合并、拆分、加水印、加密不仅效率极低,还极易出错。PyPDF2 让 Python 直接操控 PDF,彻底解放双手。

1.1 背景与意义

💡 核心认知:PyPDF2 是 Python 生态轻量、稳定、无依赖、纯 Python 实现的 PDF 处理库,支持对 PDF 文档进行页面级别的几乎所有操作。它可以实现:读取 PDF 文本、合并多个 PDF、拆分单页 PDF、旋转页面、添加水印、设置密码、获取文档信息等核心功能。

据行业统计,70% 以上的文档自动化项目依赖 PyPDF2,能把人工几十分钟的 PDF 处理工作,压缩到几秒内完成,是职场提效神器。

1.2 本章结构概览

为了让你系统性掌握 PyPDF2,本章严格按以下路线递进学习:

plaintext

复制代码
📊 环境安装 → 核心概念 → 读取PDF → 写入PDF → 合并拆分 → 页面操作 → 水印加密 → 批量实战 → 最佳实践 → 常见问题 → 总结展望

二、核心概念解析

2.1 基本定义

概念一:PyPDF2 核心能力清单

表格

能力 说明 典型应用场景
读取 PDF 提取文本、页数、文档信息 内容检索、数据采集
写入 PDF 创建新 PDF、写入页面 自动生成报告、合成文档
合并 PDF 多个 PDF 合并为一个 报告汇总、资料整理
拆分 PDF 按页 / 按范围拆分为多个 单页提取、分发打印
页面操作 旋转、颠倒、调整顺序 排版修正、格式优化
添加水印 文字 / 图片水印 版权声明、保密文件
加密解密 设置打开密码、权限 合同保护、涉密文档
概念二:PDF 文档结构(PyPDF2 视角)
  • PdfReader:PDF 读取器(v2.0+ 新版)
  • PdfWriter:PDF 写入器,用于生成 / 导出
  • PageObject:页面对象,所有页面操作的基础
  • DocumentInformation:文档元信息(标题、作者、时间)
  • PageRange:页面范围,用于拆分指定页面

2.2 关键术语解释

⚠️ 注意:以下术语是看懂 PyPDF2 代码的基础,必须掌握。

  1. PageObject:页面对象,代表 PDF 中的一页
  2. mergePage :页面叠加,用于添加水印3. encrypt/decrypt:加密与解密
  3. addPage/insertPage:添加 / 插入页面
  4. getPage(pageNumber):获取指定页码页面

2.3 技术架构概览

💡 架构理解:

plaintext

复制代码
┌─────────────────────────────────────────┐
│              读取端 PdfReader           │
│          打开、读页、提取文本、信息      │
├─────────────────────────────────────────┤
│              页面层 PageObject          │
│        旋转、裁剪、合并、水印、叠加      │
├─────────────────────────────────────────┤
│              写入端 PdfWriter           │
│        添加页、加密、保存、导出          │
├─────────────────────────────────────────┤
│              工具功能                   │
│        合并、拆分、批量、加密解密       │
└─────────────────────────────────────────┘

三、环境安装与快速入门

3.1 安装 PyPDF2

bash

运行

python 复制代码
# 安装最新稳定版
pip install PyPDF2

# 验证安装
pip show PyPDF2

3.2 第一个程序:读取 PDF 基本信息

python

运行

python 复制代码
# 导入PyPDF2的读取类
from PyPDF2 import PdfReader

# 1. 打开PDF文件
reader = PdfReader("示例.pdf")

# 2. 获取总页数
page_count = len(reader.pages)
print("总页数:", page_count)

# 3. 获取文档信息
info = reader.metadata
print("标题:", info.title)
print("作者:", info.author)
print("创建者:", info.creator)

# 4. 提取第一页文本
page = reader.pages[0]
text = page.extract_text()
print("第一页内容:\n", text)

✅ 运行即可直接查看 PDF 页数、信息、文本内容。


四、读取操作:提取 PDF 内容

4.1 读取单页文本

python

运行

python 复制代码
from PyPDF2 import PdfReader

# 打开PDF
reader = PdfReader("测试.pdf")

# 获取第1页(索引从0开始)
page = reader.pages[0]

# 提取文本
text = page.extract_text()

# 输出
print("=" * 50)
print(text)
print("=" * 50)

4.2 批量读取所有页文本

python

运行

python 复制代码
from PyPDF2 import PdfReader

reader = PdfReader("多页文档.pdf")

# 存储全部文本
full_text = ""

# 遍历所有页面
for i, page in enumerate(reader.pages):
    print(f"正在读取第 {i+1} 页...")
    full_text += f"========== 第{i+1}页 ==========\n"
    full_text += page.extract_text() + "\n\n"

# 保存到txt
with open("PDF全文.txt", "w", encoding="utf-8") as f:
    f.write(full_text)

print("✅ 全文提取完成,已保存为 PDF全文.txt")

4.3 获取 PDF 完整元数据

python

运行

python 复制代码
from PyPDF2 import PdfReader

reader = PdfReader("资料.pdf")
meta = reader.metadata

print("===== PDF文档信息 =====")
print("标题:", meta.title)
print("作者:", meta.author)
print("主题:", meta.subject)
print("创建者:", meta.creator)
print("生产者:", meta.producer)
print("创建日期:", meta creation_date)
print("修改日期:", mod_date)

五、写入与创建 PDF

5.1 从无到有创建新 PDF

python

运行

python 复制代码
from PyPDF2 import PdfWriter

# 1. 创建写入对象
writer = PdfWriter()

# 2. 添加空白页(宽高:英寸单位)
# 常见A4:612 × 792
writer.add_blank_page(width=612, height=792)

# 3. 保存为新PDF
with open("新建空白PDF.pdf", "wb") as f:
    writer.write(f)

print("✅ 新PDF创建成功!")

5.2 从已有 PDF 复制页面生成新 PDF

python

运行

python 复制代码
from PyPDF2 import PdfReader, PdfWriter

# 读取源文件
reader = PdfReader("源文件.pdf")
# 创建写入器
writer = PdfWriter()

# 复制第1、2页到新PDF
writer.add_page(reader.pages[0])
writer.add_page(reader.pages[1])

# 保存
with open("复制前两页.pdf", "wb") as f:
    writer.write(f)

print("✅ 页面复制完成!")

六、PDF 合并与拆分(最高频实战)

6.1 合并多个 PDF 为一个

python

运行

python 复制代码
from PyPDF2 import PdfReader, PdfWriter

# 待合并的PDF列表
pdf_files = [
    "第1部分.pdf",
    "第2部分.pdf",
    "第3部分.pdf"
]

# 创建写入器
writer = PdfWriter()

# 遍历合并
for file in pdf_files:
    reader = PdfReader(file)
    # 把每一页加入写入器
    for page in reader.pages:
        writer.add_page(page)

# 保存合并结果
with open("合并完成.pdf", "wb") as f:
    writer.write(f)

print("✅ 多个PDF合并成功!")

6.2 按页码范围拆分 PDF

python

运行

python 复制代码
from PyPDF2 import PdfReader, PdfWriter

reader = PdfReader("大文档.pdf")
writer = PdfWriter()

# 拆分出 第3页~第7页
start_page = 2  # 索引从0开始
end_page = 6

for i in range(start_page, end_page + 1):
    writer.add_page(reader.pages[i])

# 保存
with open("拆分结果_第3-7页.pdf", "wb") as f:
    writer.write(f)

print("✅ PDF按页拆分完成!")

6.3 每页单独拆分成一个 PDF

python

运行

python 复制代码
from PyPDF2 import PdfReader, PdfWriter
import os

reader = PdfReader("批量拆分.pdf")

# 创建输出目录
if not os.path.exists("拆分结果"):
    os.mkdir("拆分结果")

# 遍历每页
for i, page in enumerate(reader.pages):
    writer = PdfWriter()
    writer.add_page(page)
    # 保存为单页PDF
    filename = f"拆分结果/第{i+1}页.pdf"
    with open(filename, "wb") as f:
        writer.write(f)

print("✅ 全部页面拆分完成!")

七、页面高级操作

7.1 旋转 PDF 页面

python

运行

python 复制代码
from PyPDF2 import PdfReader, PdfWriter

reader = PdfReader("需要旋转.pdf")
writer = PdfWriter()

# 旋转所有页面 90度
for page in reader.pages:
    page.rotate(90)  # 支持 90/180/270
    writer.add_page(page)

with open("旋转完成.pdf", "wb") as f:
    writer.write(f)

print("✅ 页面旋转完成!")

7.2 调整页面顺序

python

运行

python 复制代码
from PyPDF2 import PdfReader, PdfWriter

reader = PdfReader("乱序.pdf")
writer = PdfWriter()

# 自定义顺序:第2页 → 第1页 → 第3页
order = [1, 0, 2]

for idx in order:
    writer.add_page(reader.pages[idx])

with open("顺序调整完成.pdf", "wb") as f:
    writer.write(f)

print("✅ 页面顺序调整成功!")

八、添加水印(企业必备)

8.1 给 PDF 添加文字水印

先制作一个只有水印文字的 PDF(水印.pdf),再用代码叠加

python

运行

python 复制代码
from PyPDF2 import PdfReader, PdfWriter

def add_watermark(pdf_path, watermark_path, output_path):
    """
    给PDF添加水印
    :param pdf_path: 原PDF路径
    :param watermark_path: 水印PDF路径
    :param output_path: 输出路径
    """
    pdf_reader = PdfReader(pdf_path)
    watermark_reader = PdfReader(watermark_path)
    watermark_page = watermark_reader.pages[0]
    writer = PdfWriter()

    # 给每一页叠加水印
    for page in pdf_reader.pages:
        page.merge_page(watermark_page)
        writer.add_page(page)

    with open(output_path, "wb") as f:
        writer.write(f)

# 调用
add_watermark(
    pdf_path="文档.pdf",
    watermark_path="水印.pdf",
    output_path="加水印完成.pdf"
)
print("✅ 水印添加成功!")

九、PDF 加密与解密

9.1 给 PDF 添加打开密码

python

运行

python 复制代码
from PyPDF2 import PdfReader, PdfWriter

reader = PdfReader("未加密.pdf")
writer = PdfWriter()

# 复制所有页面
for page in reader.pages:
    writer.add_page(page)

# 设置密码
password = "123456"
writer.encrypt(user_password=password, owner_password="admin888")

# 保存
with open("加密完成.pdf", "wb") as f:
    writer.write(f)

print(f"✅ PDF已加密,密码:{password}")

9.2 解密受保护的 PDF

python

运行

python 复制代码
from PyPDF2 import PdfReader, PdfWriter

def decrypt_pdf(input_path, output_path, password):
    reader = PdfReader(input_path)
    # 解密
    reader.decrypt(password)
    writer = PdfWriter()

    for page in reader.pages:
        writer.add_page(page)

    with open(output_path, "wb") as f:
        writer.write(f)

# 使用
decrypt_pdf(
    input_path="加密文件.pdf",
    output_path="解密完成.pdf",
    password="123456"
)
print("✅ PDF解密成功!")

十、企业级批量实战

10.1 批量给文件夹所有 PDF 加水印

python

运行

python 复制代码
from PyPDF2 import PdfReader, PdfWriter
import os

def batch_add_watermark(input_dir, output_dir, watermark_pdf):
    if not os.path.exists(output_dir):
        os.mkdir(output_dir)
    
    watermark_page = PdfReader(watermark_pdf).pages[0]

    for filename in os.listdir(input_dir):
        if filename.endswith(".pdf"):
            pdf_path = os.path.join(input_dir, filename)
            output_path = os.path.join(output_dir, filename)
            
            reader = PdfReader(pdf_path)
            writer = PdfWriter()
            
            for page in reader.pages:
                page.merge_page(watermark_page)
                writer.add_page(page)
            
            with open(output_path, "wb") as f:
                writer.write(f)
            print(f"已处理:{filename}")

# 执行批量加水印
batch_add_watermark(
    input_dir="待处理",
    output_dir="已加水印",
    watermark_pdf="水印.pdf"
)
print("✅ 批量加水印完成!")

十一、最佳实践分享

最佳实践一:文件流安全操作

  • 始终使用 with open(...) as f 打开文件
  • 处理完成及时关闭流
  • 避免源文件被占用

最佳实践二:大批量处理优化

  • 循环复用 PdfReader/PdfWriter
  • 大文件分批次处理
  • 加水印先缓存水印页面

最佳实践三:兼容性优先

  • 优先处理文字型 PDF,图片 PDF 无法提取文本
  • 加密 PDF 先解密再操作
  • 跨平台使用统一路径格式

最佳实践四:错误处理

  • 捕获 FileNotFoundError、 PdfReadError
  • 加密文件判断 is_encrypted
  • 页码越界提前判断

十二、常见问题解答

Q1:PyPDF2 无法提取图片 PDF 文本?

A:无法提取。PyPDF2 仅支持文字型 PDF,图片扫描 PDF 需用 pytesseract OCR。

Q2:读取时报 PdfReadError?

A:文件损坏、加密、版本过高,可尝试用 WPS/Word 重新导出 PDF。

Q3:encrypt/decrypt 无效?

A:PyPDF2 仅支持RC4 加密,不支持 AES 高版本加密。

Q4:合并后 PDF 空白 / 乱码?

A:原 PDF 版本过高、存在表单或特殊字体,重新打印为 PDF 即可解决。

Q5:extract_text () 结果为空?

A:PDF 是图片、文字被转曲、加密,先解密再尝试。


十三、未来发展趋势

  1. AI + PDF 自动化:AI 识别、摘要、分类、翻译
  2. 多格式互通:PDF ↔ Word ↔ Excel ↔ Markdown
  3. 云端自动化:对接钉钉 / 飞书自动处理
  4. OCR + PyPDF2:图片 PDF 智能文字提取

十四、本章小结

14.1 核心要点回顾

✅ 本章完整覆盖:

  1. 环境安装与基础信息读取
  2. 单页 / 全文文本提取
  3. 新建、复制、写入 PDF
  4. 多页合并、按页拆分、批量拆分
  5. 页面旋转、顺序调整
  6. 文字水印添加
  7. PDF 加密、解密
  8. 企业级批量处理实战
  9. 最佳实践与高频问题解决

14.2 学习建议

  1. 先跑通示例代码,再替换自己的 PDF
  2. 工作中遇到重复 PDF 处理直接写成脚本
  3. 图片 PDF 结合 OCR 工具使用
  4. 复杂排版优先使用 merge_page 叠加

十五、课后练习

  1. 基础练习:读取任意 PDF,输出页数、标题、第一页文本
  2. 进阶练习:将两个 PDF 合并,并给第一页旋转 90 度
  3. 实战练习:批量给 10 个 PDF 添加统一水印并加密

十六、参考资料

  1. PyPDF2 官方文档:https://pypdf2.readthedocs.io
  2. Python 官方文档:https://docs.python.org
  3. PDF 格式规范:Adobe PDF Reference111

💬 本文全套代码100% 可直接复制到 CSDN 运行 ,注释超详细,零基础也能轻松吃透 PyPDF2!专注分享 Python 办公自动化、数据分析、爬虫实战、模块精讲等硬核干货,全程落地、拒绝水文!点赞 + 收藏 + 关注,下期带来更多能直接提升职场效率的 Python 神器,让你用代码解放双手,少加班、多赚钱!

相关推荐
William.csj2 小时前
科研——PPT导出高清PDF的方法
pdf·ppt
开开心心_Every2 小时前
跨平台高速下载工具,支持浏览器功能强大
运维·服务器·随机森林·pdf·电脑·逻辑回归·excel
daanpdf2 小时前
永乐大典pdf电子版(现存最全版本)
pdf
好运的阿财2 小时前
OpenClaw工具拆解之 image+pdf
人工智能·python·程序人生·pdf·ai编程·openclaw·openclaw工具
开开心心就好1 天前
避免借电脑尴尬的故障模拟工具
科技·游戏·visualstudio·edge·pdf·电脑·powerpoint
南风微微吹2 天前
全国事业单位联考A、B、C、D、E类历年真题及答案解析PDF电子版(2015-2025年下)
pdf·考公
优化控制仿真模型2 天前
【2026年最新】毕业论文答辩、开题汇报PPT模版电子版下载
经验分享·pdf
daanpdf2 天前
大一《中国近代史纲要》题库及答案PDF知识点整理笔记
笔记·pdf
采坑先锋2 天前
复杂图标的word转pdf
pdf·word