PyPDF2/pypdf加密解密需区分打开密码与编辑密码,encrypt()仅作用于PdfWriter且必须write()输出新文件,decrypt()返回0表示失败,仅支持RC4或部分AES,不兼容时应换用qpdf等工具。

能用 PyPDF2 或更新的 pypdf 完成,但必须分清「打开密码」和「编辑密码」——前者控制能否打开文件,后者控制能否复制、打印、修改。绝大多数日常场景只涉及打开密码,解密也仅需该密码。
加密 PDF 时为什么用 encrypt() 却不生效?
常见错误是调用 encrypt() 后没把内容写入新文件,或者写入时用了原路径覆盖原文件但未关闭读取句柄。
-
encrypt()只作用于PdfWriter对象,不修改原始文件 - 必须用
write()将加密后的内容显式写入新文件(不能直接覆盖原文件) - 如果原 PDF 已被
PdfReader打开且未关闭,Windows 下可能报PermissionError - PyPDF2 v3.0+ 推荐用
pypdf替代,API 更清晰;旧版PdfFileWriter.encrypt()不支持 AES-256,仅 RC4
正确写法示例:
from pypdf import PdfReader, PdfWriter
<p>reader = PdfReader("input.pdf")
writer = PdfWriter(clone_from=reader)
writer.encrypt("123456") # 默认使用 AES-256-R5
with open("output_encrypted.pdf", "wb") as f:
writer.write(f)
解密 PDF 时 decrypt() 返回 0 或报错怎么办?
decrypt() 返回 0 表示密码错误或加密类型不支持;返回 1 才代表成功。它只对 PdfReader 实例生效,且必须在读取后、访问页面前调用。
立即学习“Python免费学习笔记(深入)”;
- 不要在
is_encrypted == False时调用decrypt(),会引发NotImplementedError - 密码区分大小写,空格容易被忽略
- 某些 PDF 使用了 PyPDF2 不支持的加密方案(如 AES-256 with revision 6),此时
decrypt()永远失败 - 若已知密码但解密失败,可先用
pdf_reader.metadata.get("/Encrypted")查看加密元数据
安全解密流程:
from pypdf import PdfReader, PdfWriter
<p>reader = PdfReader("locked.pdf")
if reader.is_encrypted:
if reader.decrypt("mypassword") != 1:
raise ValueError("密码错误或加密方式不受支持")
writer = PdfWriter()
for page in reader.pages:
writer.add_page(page)
with open("unlocked.pdf", "wb") as f:
writer.write(f)
批量处理多个 PDF 时要注意路径和异常隔离
批量加解密最常踩的坑是单个文件失败导致整个脚本中断,或输出路径拼接错误造成文件覆盖。
- 用
os.path.join()或pathlib.Path构造路径,避免 Windows/Linux 路径分隔符差异 - 每个文件操作都套
try/except,记录失败文件名而非抛出异常 - 解密时若密码为空(
None),decrypt()会静默跳过,不会报错但也不起作用 - 加密输出文件名建议带后缀标识,比如
file_enc.pdf,防止误覆盖源文件
简单批量加密示意:
from pypdf import PdfReader, PdfWriter
from pathlib import Path
<p>files = Path("pdfs/").glob("*.pdf")
for f in files:
try:
reader = PdfReader(f)
writer = PdfWriter(clone_from=reader)
writer.encrypt("batch2026")
out_path = f.with_name(f"{f.stem}_enc.pdf")
with open(out_path, "wb") as g:
writer.write(g)
print(f"✅ {f.name} → {out_path.name}")
except Exception as e:
print(f"❌ {f.name}: {e}")
真正麻烦的从来不是代码几行,而是 PDF 加密本身没有统一标准:不同生成工具用的算法、权限位、修订版本都可能不同。哪怕密码正确,pypdf 也可能因底层加密细节不兼容而解不开——这时候别硬刚,换工具(如 qpdf 命令行)或确认原始文件是否真能被标准阅读器打开。



















