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
相关产品推荐
相关产品推荐

