使用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
相关产品推荐
相关产品推荐

