You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.7中fitz.Document调用getText()出现解码乱码问题求助

Python 3.7中PyMuPDF (fitz) getText() 返回大量chr(65533)乱码的原因与解决办法

问题原因

  • 字体嵌入不完整/编码映射缺失:不少PDF仅嵌入了显示所需的字形,未附带完整的字符编码映射表。Acrobat这类阅读器会自动调用系统字体补全并做编码匹配,但fitz提取时找不到对应Unicode映射,就会用chr(65533)(替换字符)填充。
  • fitz默认提取逻辑的局限性:"text"模式提取时优先依赖PDF内部的字符编码映射,一旦映射错误或缺失就会乱码;而Acrobat的文本复制逻辑更复杂,会结合字形和系统字体做智能匹配。
  • 旧版本PyMuPDF的编码兼容问题:Python 3.7搭配的PyMuPDF版本可能偏旧,对葡萄牙语重音字符、特殊符号这类编码的支持不完善。

解决办法

1. 切换文本提取模式

尝试"blocks"或"dict"模式,这些模式保留更多字体和字符信息,能绕过部分编码映射问题:

import fitz

pdf_reader = fitz.open(input_file)
# 用blocks模式提取文本块列表
page_blocks = pdf_reader[0].get_text("blocks")
# 合并成纯文本
text = "\n".join([block[4] for block in page_blocks])

# 或者用dict模式提取结构化数据
page_dict = pdf_reader[0].get_text("dict")
text = "\n".join([block["text"] for block in page_dict["blocks"]])

2. 手动处理字形编码映射

提取字形编码后,根据PDF实际使用的编码(比如Windows-1252)手动映射:

import fitz

pdf_reader = fitz.open(input_file)
page = pdf_reader[0]
text = ""
# 遍历每个文字块的字形信息
for glyph in page.get_text("glyphs"):
    # 优先用字形对应的unicode,替换无效字符
    char = glyph["unicode"] if glyph["unicode"] != 65533 else chr(glyph["code"])
    text += char

3. 更新PyMuPDF到兼容版本

Python 3.7虽已停止维护,但可安装支持它的最新PyMuPDF版本,修复编码兼容问题:

pip install --upgrade pymupdf==1.21.1  # 该版本适配Python 3.7

4. 结合OCR提取(针对伪文本PDF)

如果PDF是扫描件却伪装成文本层,fitz提取会失效,可结合Tesseract OCR处理:

import fitz
import pytesseract

pdf_reader = fitz.open(input_file)
page = pdf_reader[0]
# 生成页面截图
pix = page.get_pixmap()
pix.save("temp_page.png")
# 用葡萄牙语OCR提取文本
text = pytesseract.image_to_string("temp_page.png", lang="por")

内容的提问来源于stack exchange,提问作者MrT77

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 20:23:21