如何阻止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
相关产品推荐
相关产品推荐

