使用Python Fitz搜索PDF单词时efficiency匹配失败问题求助
使用PyMuPDF(fitz)搜索PDF单词时部分单词匹配失败的问题
我用Python的fitz库(PyMuPDF)在PDF文档中搜索一个单词列表,大多数单词都能正常匹配,但像“efficiency”这类少数单词却无法匹配。我的代码片段如下:
if (len(re.findall(f'\b{phrase.casefold()}s?\b', mpage.casefold(), flags=0))>0) : text_instances = page.search_for(phrase, quads=True)
对于“efficiency”,if语句中的正则表达式能成功匹配,但page.search_for()方法却无法找到它。观察发现这个单词里的两个“f”字体不同(见下图),是不是这个原因导致匹配失败?

问题原因
没错,就是两个“f”字体不同导致的page.search_for()匹配失败。
fitz的page.search_for()是基于PDF底层的文本块和字符属性做匹配的:如果同一个单词内的字符来自不同的字体(甚至分属不同的文本对象),库会将它们视为不连续的内容,无法识别为完整的单词。而正则匹配是提取页面纯文本后进行的,纯文本已经把不同字体的字符拼接成了完整单词,所以能成功匹配。
解决方案
- 方案一:基于
page.get_text("words")定位
先通过page.get_text("words")获取页面所有单词的位置信息,再遍历匹配目标短语:import re import fitz target_phrase = "efficiency" doc = fitz.open("your_document.pdf") page = doc[0] # 示例取第一页 words = page.get_text("words") # 返回格式:(x0, y0, x1, y1, text, block_no, line_no, word_no) for word_info in words: word_text = word_info[4] # 匹配目标短语(支持可选的末尾s) if re.fullmatch(f'{target_phrase.casefold()}s?', word_text.casefold()): print(f"找到匹配:{word_text},坐标范围:{word_info[:4]}") - 方案二:处理复杂文本场景
如果需要处理跨行、连字符拆分等复杂情况,可以先提取页面的字符级位置映射(用page.get_text("chars")),再结合正则匹配的文本位置去对应PDF中的坐标,不过实现复杂度更高。 - 特殊情况处理
如果PDF是扫描件转的OCR文档,字符拆分问题会更普遍,这种情况可能需要重新用OCR工具(比如Tesseract)处理文本后再匹配。
内容的提问来源于stack exchange,提问作者vani
相关产品推荐
相关产品推荐

