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

使用PyMuPDF高亮PDF文本后,如何获取page.search_for的匹配/未匹配列表?

PyMuPDF高亮PDF文本并追踪匹配/未匹配项

以下是针对你的需求的解决方案,可实现高亮文本的同时,追踪找到的文本和未匹配的文本,以及提取匹配区域的实际内容:

1. 追踪找到与未找到的文本列表

修改你的原始脚本,新增两个列表分别记录已匹配和未匹配的文本,同时修正原代码中统计结果的错误(原代码的i仅为最后一个文本的索引,无法代表总匹配次数):

import fitz

# 加载PDF文档
doc = fitz.open(filename)

found_texts = []  # 存储成功匹配并高亮的文本
missing_texts = []  # 存储未找到的文本
total_highlighted = 0  # 统计所有高亮的位置数量

# 遍历PDF的每一页
for page in doc:
    # 遍历目标文本列表
    for target_text in text_list:
        # 搜索目标文本,返回匹配的四边形区域
        match_regions = page.search_for(target_text, quads=True)
        if match_regions:
            # 添加高亮注释
            page.add_highlight_annot(match_regions)
            found_texts.append(target_text)
            total_highlighted += len(match_regions)
        else:
            # 未找到则加入缺失列表
            missing_texts.append(target_text)

# 保存修改后的PDF
doc.save("highlighted_result.pdf")
doc.close()

# 输出统计信息
print(f"总计高亮 {total_highlighted} 处内容")
print(f"成功匹配的文本: {found_texts}")
print(f"未找到的文本: {missing_texts}")

2. 获取匹配区域的实际文本内容

page.search_for仅返回文本的位置信息(四边形/矩形),若需要提取这些区域的实际文本内容,可以通过page.get_text()方法结合匹配区域实现:

# 在上述代码的if match_regions:块内添加以下代码,提取每个匹配区域的文本
actual_matched = []
for quad in match_regions:
    # 将四边形区域转换为矩形,用于提取文本
    text_clip = fitz.Rect(quad)
    extracted_text = page.get_text("text", clip=text_clip).strip()
    actual_matched.append(extracted_text)
print(f"文本「{target_text}」的实际匹配内容: {actual_matched}")

额外说明

  • 若text_list包含重复文本,found_texts会重复记录对应文本;如需去重,可使用list(set(found_texts)),但会打乱原顺序。
  • page.search_for默认是精确匹配,区分大小写和空格;若需模糊匹配,可先对目标文本和PDF文本做统一预处理(如转小写、去除多余空格)后再执行搜索。

内容的提问来源于stack exchange,提问作者SamVimes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:20:47