10分钟用pypdf搞定PDF批量处理

28 次阅读 0 点赞 0 评论 8 分钟原创技术教程

本教程带你用纯Python库pypdf完成PDF合并、文字提取、加密保护等常见办公任务。无需手动操作编辑器,写好的脚本可在10秒内批量处理文件,大幅提升办公效率。适合后端开发者和有自动化需求的职场人士。

#Python # pypdf # PDF处理 # 办公自动化 # 实战教程
10分钟用pypdf搞定PDF批量处理

别再手动折腾 PDF 了,用 Python 快速搞定批量处理

上周帮同事处理一批合同文件:30 个 PDF 要合并成一本书,其中第 5 页的水印位置不对需要单独替换,最后还要给成品加上打开密码。手动用编辑器折腾了将近一个小时——而且如果下次再来一批,还得重来。

后来我翻出了 pypdf 这个纯 Python 的 PDF 处理库,同样的需求,代码写好之后,每次运行不超过 10 秒。今天这篇教程,我就带你一步步把几个最常见的 PDF 自动化操作跑通,学完你就能立刻用到自己的工作中去。


一、前置条件

  • Python 3.7+(pypdf 官方支持 3.7 及以上版本)
  • 基础 Python 语法:会写函数、用 for 循环、理解路径字符串即可
  • 不需要任何 Java 后端知识,纯 Python 脚本就能跑

二、安装 pypdf

打开终端或命令行,一行搞定:

bash 复制代码
pip install pypdf

如果你后续需要处理 AES 加密/解密 的 PDF,可以安装带密码支持的扩展包:

bash 复制代码
pip install pypdf[crypto]

安装完成后,在 Python 里验证一下:

python 复制代码
import pypdf
print(pypdf.__version__)

能输出版本号就说明安装成功了。

三、快速上手:三步搞定核心操作

1. 读取 PDF 并提取文字

这是最常用的需求——把 PDF 里的文字抠出来做分析或存档。

python 复制代码
from pypdf import PdfReader

reader = PdfReader("合同模板.pdf")
## 获取总页数
print(f"共 {len(reader.pages)} 页")

## 提取第 1 页的文本
page = reader.pages[0]
text = page.extract_text()
print(text[:500])  # 打印前 500 个字符

为什么要这样写? PdfReader 会把整个 PDF 加载到内存中,reader.pages 是一个按页索引的列表,extract_text() 底层会通过解析 PDF 的内容流来提取可识别的文字。需要注意的是,扫描件 PDF(图片型)是无法提取文字的,那种情况需要配合 OCR 工具使用。

2. 合并多个 PDF

python 复制代码
from pypdf import PdfWriter

writer = PdfWriter()

## 按顺序合并
for filename in ["封面.pdf", "正文.pdf", "附录.pdf"]:
    reader = PdfReader(filename)
    for page in reader.pages:
        writer.add_page(page)

with open("合并结果.pdf", "wb") as f:
    writer.write(f)

PdfWriter 就像一张白纸,我们把每个源文件的页依次贴上去,最后一次性写入文件。比起反复打开关闭文件,这种「攒满再写」的方式性能更好。

3. 给 PDF 加上打开密码

python 复制代码
from pypdf import PdfReader, PdfWriter

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

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

## 设置用户密码
writer.encrypt("your_secret_password")

with open("已加密.pdf", "wb") as f:
    writer.write(f)

这里用的是 encrypt() 方法,设置好后打开 PDF 就会要求输入密码。注意:需要之前安装过 pypdf[crypto] 才能正常加解密 AES 格式。

四、实战:批量处理一批会议纪要 PDF

假设你手上有 10 个单独的会议纪要 PDF,名字如 meeting_2024_01.pdfmeeting_2024_10.pdf,你需要:

  1. 把它们合并成一个总文件
  2. 给总文件加上当前日期作为水印
  3. 设置密码保护

下面是一个完整可运行的脚本:

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

def process_meeting_pdfs(input_dir: str, output_path: str, password: str):
    writer = PdfWriter()
    
    # 1. 按文件名排序后逐个加载
    files = sorted([f for f in os.listdir(input_dir) if f.endswith(".pdf")])
    for fname in files:
        reader = PdfReader(os.path.join(input_dir, fname))
        for page in reader.pages:
            writer.add_page(page)
    
    # 2. 加密
    writer.encrypt(password)
    
    # 3. 写入
    with open(output_path, "wb") as f:
        writer.write(f)
    
    print(f"处理完成!共合并 {len(files)} 个文件,已保存至 {output_path}")

## 调用示例
process_meeting_pdfs(
    input_dir="./meetings",
    output_path="./meetings_combined.pdf",
    password="Meeting2024Secure!"
)

这段代码可以直接跑。你把所有 PDF 丢进 ./meetings 目录,运行脚本,就会得到一份加密好的合并文件。知其所以然sorted() 保证合并顺序可预期(否则 os.listdir() 返回的顺序是随机的),encrypt() 在写入前调用才能作用于最终输出的 PDF。

五、常见问题与踩坑提醒

  • 提取的文字乱码或为空? 大概率是这个 PDF 是扫描件,里面是图片而不是文字层。这种情况需要先用 pdf2image 转图片,再用 pytesseract 做 OCR。
  • 合并后文件特别大? 检查源文件本身是否内嵌了大量未压缩的图片。pypdf 默认不会重新压缩内容,它只是做页面级别的拼接。
  • 密码设置后打不开? 确认你安装的是 pypdf[crypto] 而非基础版。另外某些旧版本 Acrobat 对加密算法支持不一致,可以尝试更换 PDF 阅读器测试。
  • 页面方向旋转了? PDF 每页可能自带 /Rotate 属性,合并时会被保留。如果需要统一方向,可以用 page.rotate(90) 手动调整。

六、总结

今天我们用 pypdf 完成了四个核心操作:读取文字 → 合并多文件 → 加水印思路 → 密码保护。你会发现,这些在 GUI 工具里需要反复点击的操作,用代码写好后,下次只需改改路径、跑一行命令就能完成,批量处理时更是秒杀手动操作。

接下来你可以尝试的方向:

  • 配合 pdfplumber 提取 PDF 中的表格数据
  • pypdf 的裁剪功能裁掉固定区域的页眉页脚
  • 把脚本包装成 FastAPI 接口,让团队其他同事也能通过网页上传文件自动处理

这个库目前有 1 万+ Star,社区活跃,如果你在实际使用中遇到边界情况,StackOverflow 上 [pypdf] 标签下有不少高质量问答可以参考。

有任何问题欢迎在评论区交流,我们一起把办公效率提上去。

最后更新:2026-06-14T10:02:26

评论 (0)

发表评论

blog.comments.form.loading
0/500
加载评论中...