
本文详解 PyMuPDF(fitz)提取 PDF 文本时出现乱码(如 \xc2\x91\xc2\x99)的根本原因与解决方案,强调避免误用 .encode('utf-8'),正确使用 .get_text() 并辅以编码清理策略,确保输出干净、可读的 Unicode 文本。
本文详解 pymupdf(fitz)提取 pdf 文本时出现乱码(如 `\xc2\x91\xc2\x99`)的根本原因与解决方案,强调避免误用 `.encode('utf-8')`,正确使用 `.get_text()` 并辅以编码清理策略,确保输出干净、可读的 unicode 文本。
在使用 PyMuPDF(即 fitz 模块)从 PDF 中提取文本时,一个常见误区是:对 .get_text() 返回的已解码字符串再次调用 .encode('utf-8'),这会导致 Unicode 字符被错误地双重编码为字节序列(如 ’ 变成 \xe2\x80\x99),最终显示为 \xc2\x91\xc2\x99 等不可读字节转义——这并非 PDF 内容本身损坏,而是 Python 字符串处理逻辑出错。
✅ 正确做法是:.get_text() 默认返回 UTF-8 解码后的 str 对象,应直接使用,无需编码。若仍出现乱码,说明 PDF 内嵌字体未正确映射或存在非标准编码,此时需针对性清理,而非盲目重编码。
✅ 推荐代码(修正版)
import fitz # 注意:PyMuPDF 的推荐导入方式是 import fitz
doc = fitz.open("uber-report.pdf")
page = doc[1] # 获取第二页(索引从 0 开始)
text = page.get_text() # ✅ 直接获取 str 类型文本,不加 .encode()
print(text)
⚠️ 若仍有异常字符(如 \r\xc2\x91\xc2\x99\x03),请按以下步骤清理:
-
识别问题根源:这些
\xc2\x91等是 UTF-8 编码字节被错误当作 Latin-1 字节解码后残留的“伪字节字符串”; -
安全修复策略(仅当
get_text()输出含原始字节转义时适用):# 假设 text 是包含 \x 转义的字符串(罕见,通常只发生在日志打印或调试中) # 实际开发中,应优先检查是否误用了 encode() raw_bytes = text.encode('latin-1') # 将错误解码的 str 按 latin-1 回转为 bytes clean_text = raw_bytes.decode('utf-8', errors='replace') # 再以 UTF-8 安全解码但请注意:该方案是兜底手段,不应作为常规流程。绝大多数情况下,删除
.encode('utf-8')即可解决问题。
? 额外建议提升提取质量
- 使用
page.get_text("text")(显式指定模式)替代默认调用,更稳定; - 对含复杂排版/扫描件的 PDF,考虑启用 OCR(需搭配
pix2text或pytesseract); - 过滤控制字符:
import re; clean_text = re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]', '', text); - 处理换行与空格:
text.replace('\n', ' ').replace('\r', ' ').strip()(按业务需求调整)。
? 总结:PyMuPDF 的
.get_text()是 Unicode 友好的——它输出的是 Pythonstr,不是bytes。把str再.encode()是典型类型误用。牢记:提取 → 清理 → 使用,而非“提取 → 错误编码 → 徒劳解码”。











