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

如何阻止PyMuPDF将‘ff’转换为@或I等异常字符?

如何阻止PyMuPDF将‘ff’转换为@或I等异常字符?

嘿,这个问题我之前也踩过坑!你提到的「ligatures(连字)」其实是PDF排版里的常见操作——为了让文字排版更紧凑美观,设计师会把ff、fi、fl这类经常连在一起的字母组合做成一个单独的特殊字形。但PyMuPDF默认读取时,没把这些特殊字形自动还原成普通字母,就出现了你看到的@、I这类乱码。

给你两个靠谱的解决办法,优先试第一个:

方法一:用PyMuPDF内置参数忽略连字

PyMuPDF的get_text()方法有个flags参数,其中fitz.TEXTFLAGS_IGNORE_LIGATURES可以直接让程序把连字拆回原本的字母组合。修改你的代码就行:

import fitz
import numpy as np
import pandas as pd

# open the document
doc = fitz.open(filename_path)

# 先初始化文本为空字符串
doc_text = ""

# get the text from each page in the document
for idx, page in enumerate(doc):
    page = doc.load_page(idx)
    # 添加flags参数,忽略连字
    page_text = page.get_text("text", flags=fitz.TEXTFLAGS_IGNORE_LIGATURES)
    doc_text += page_text

# store the document text in a "text" column in my dataframe
doc_df["text"] = doc_text

这个参数会自动识别PDF里的标准连字(比如Unicode里的ff、fi),直接转换成对应的ff、fi,不用你手动处理,省心很多。

方法二:手动替换异常连字

如果有些PDF用了非标准的连字,第一种方法没生效,那可以手动定义连字映射,把提取到的异常字符替换成正确内容:

# 先定义连字和对应普通字符的映射,按需添加
ligature_map = {
    "ff": "ff",
    "fi": "fi",
    "fl": "fl",
    "ffi": "ffi",
    "ffl": "ffl",
    # 把你遇到的比如"I"、"@"这类异常字符也加进来,比如:
    "I": "ff",
    "@": "ff"
}

# 提取文本后执行替换
doc_text = doc_text.translate(str.maketrans(ligature_map))

你可以把实际遇到的异常字符都补充到映射里,这样就能针对性修复了。

备注:内容来源于stack exchange,提问作者code_to_joy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 12:58:10