如何用Python及PyMUPDF高亮PDF中搜索文本的右侧对应值?
嘿,这个需求我之前也折腾过,用PyMUPDF完全能实现!核心思路就是先定位到目标关键词的位置,再精准找到它右侧的对应内容块,最后给这块内容加上高亮。下面我一步步给你讲具体实现:
实现PyMUPDF高亮关键词右侧对应值的方法
1. 基础准备:导入库并打开PDF
先确保你已经装好了PyMUPDF,然后打开目标文档和对应页面:
import fitz # PyMUPDF的标准导入方式 doc = fitz.open("your_target.pdf") # 替换成你的PDF文件路径 page = doc[0] # 假设内容在第一页,按需调整页码
2. 搜索关键词并获取位置信息
用page.search_for()找到关键词的所有匹配项,每个匹配结果都是一个fitz.Rect矩形对象,包含关键词的坐标范围:
target_keyword = "Name:" # 可以换成Profession:、Hobbies:等 keyword_matches = page.search_for(target_keyword)
3. 定位右侧对应值并添加高亮
根据PDF的排版情况,分两种常见场景处理:
场景1:关键词和对应值在同一行(最普遍)
如果关键词和对应值在同一文本行,我们可以通过文本块的字符位置来定位右侧内容:
for match_rect in keyword_matches: # 获取关键词所在行的所有文本块 line_blocks = page.get_text("blocks", clip=match_rect + fitz.Rect(0, 0, page.rect.width, 0)) for block in line_blocks: block_rect = fitz.Rect(block[:4]) block_text = block[4].strip() if target_keyword in block_text: # 计算关键词在文本块中的结束位置 keyword_end_pos = block_text.find(target_keyword) + len(target_keyword) # 估算单个字符的宽度,用来定位右侧内容的起始坐标 char_width = block_rect.width / len(block_text) # 构建对应值的高亮矩形 value_rect = fitz.Rect( block_rect.x0 + keyword_end_pos * char_width, block_rect.y0, block_rect.x1, block_rect.y1 ) # 添加高亮注释 page.add_highlight_annot(value_rect)
场景2:关键词和对应值不在同一行(比如换行布局)
如果对应值在关键词的下一行,我们可以直接搜索关键词下方的区域:
for match_rect in keyword_matches: # 定义关键词下方的搜索区域,高度可根据PDF字号调整 below_rect = fitz.Rect(match_rect.x0, match_rect.y1, page.rect.width, match_rect.y1 + 20) # 获取该区域的文本块 value_blocks = page.get_text("blocks", clip=below_rect) for block in value_blocks: value_rect = fitz.Rect(block[:4]) page.add_highlight_annot(value_rect)
4. 保存修改后的PDF
最后别忘保存修改后的文档:
doc.save("highlighted_result.pdf") doc.close()
几个实用小提示
- 如果是扫描版PDF(纯图片),PyMUPDF无法直接提取文本,得先结合OCR工具(比如pytesseract)识别文本后再操作。
- 不同PDF的字体、排版差异大,字符宽度估算可能有误差,你可以根据实际情况调整
char_width的计算逻辑,或者直接把关键词之后的整个文本块作为高亮范围。 - 代码会自动处理所有匹配到的关键词,比如文档里有多个"Name:",都会对应高亮右侧的值。
内容的提问来源于stack exchange,提问作者Lav Mehta




