pypdf2 不支持现代 pdf 加密算法(如 aes-256),仅支持旧式算法1/2;文本提取弱,对扫描件、复杂排版、中文字体编码等场景失效;内存占用高,不适用于大文件;推荐用 pikepdf、pdfplumber 或 pypdf 替代。

PyPDF2 读取 PDF 报 NotImplementedError: only algorithm code 1 and 2 are supported
这是 PyPDF2 遇到加密 PDF(尤其是 Adobe Acrobat 生成的现代加密)时最常抛出的错误。它不支持 AES-256 或某些 RC4 变体,只认老式算法(比如 PDF 1.4 以前的密码保护)。
- 先用
pdf_reader.is_encrypted检查是否加密,别直接调pdf_reader.pages - 如果返回
True,尝试用pdf_reader.decrypt("password")解密——但注意:空密码或常见默认密码(如"owner"、"user")大概率无效,多数现代 PDF 需要真实口令 - 实在没密码?别硬刚,换
pikepdf或系统级工具(如qpdf --decrypt)预处理,PyPDF2 不是万能钥匙
提取文本为空或乱码,page.extract_text() 返回空字符串
PyPDF2 的文本提取能力很弱,尤其对扫描版 PDF(本质是图片)、含复杂排版/字体嵌入/横向表格的文档,extract_text() 基本失效。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 先确认 PDF 是可选中文本的(用 Adobe Reader 或 macOS 预览双击选中文字试试)
- 如果是扫描件,PyPDF2 完全无解,必须走 OCR 路线(
pytesseract + pdf2image) - 即使文字可选,也常因字体映射缺失导致乱码,可加参数
pdf_reader = PdfReader(..., strict=False)忽略部分解析警告,但不能解决根本问题 - 替代方案:用
pdfplumber替代,它对表格和布局保留更好,page.extract_text()行为更稳定
中文乱码或缺失字符,extract_text() 输出问号或方块
PyPDF2 不解析字体编码映射,遇到非标准编码(比如 CID 字体、自定义编码的中文字体)就放弃,直接输出占位符。
- 不是编码设置问题,改
encoding参数没用——PyPDF2 根本不暴露字体解码接口 - 检查 PDF 元数据:
pdf_reader.metadata.get("/Producer"),若显示Acrobat Distiller或Microsoft Print To PDF,大概率字体嵌入不全 - 临时缓解:用
pdfplumber打开后调page.chars看原始字符对象,有时能绕过编码层拿到 Unicode - 长期建议:这类 PDF 应该由上游系统导出时勾选“嵌入所有字体”,而不是在解析端硬扛
大文件卡死或内存暴涨,PdfReader 加载几百页 PDF 直接崩
PyPDF2 默认把整个 PDF 结构加载进内存,且不做流式解析。一页含高清图或复杂矢量,体积翻倍,内存占用远超文件大小。
- 避免一次性读全部页:
for page in pdf_reader.pages[0:10]: ...比pdf_reader.pages全取更安全 - 不用
pdf_reader.pages属性反复访问——它是动态生成的,每次访问都可能触发重解析 - 真要处理大 PDF,优先考虑分页拆解:
pdftk input.pdf cat 1-50 output part1.pdf预处理,再逐段喂给 PyPDF2 - 内存敏感场景,直接弃用 PyPDF2,改用
pypdf(PyPDF2 的现代维护分支,有流式 reader 和 better memory control)
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










