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

使用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”字体不同(见下图),是不是这个原因导致匹配失败?

单词efficiency中两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:42:32