如何使用Fitz高亮PDF中包含指定单词的整段文本?
使用Fitz(PyMuPDF)高亮PDF中的整段文本
完全可以用Fitz实现整段高亮,核心思路是定位目标单词所在的文本块(通常对应一个段落),然后给该文本块的边界框添加高亮标注,具体步骤和代码示例如下:
实现步骤
打开PDF并定位目标页面
用Fitz打开目标PDF文档,获取需要处理的页面对象:import fitz doc = fitz.open("input.pdf") page = doc[0] # 替换为目标页码(从0开始计数)找到目标单词所在的文本块
Fitz的page.get_text("words")会返回页面所有单词的位置和层级信息(包含块编号、行编号),我们可以通过遍历找到包含目标单词的文本块,再计算该块的整体边界框:target_word = "需要定位的单词" target_block_no = None # 获取页面所有单词的详细信息:(x0, y0, x1, y1, 单词文本, 块编号, 行编号, 单词编号) all_words = page.get_text("words") # 查找包含目标单词的块编号 for word_info in all_words: if word_info[4] == target_word: target_block_no = word_info[5] break # 计算目标块的整体边界框 if target_block_no is not None: block_words = [w for w in all_words if w[5] == target_block_no] # 取块内所有单词的最小/最大坐标,得到整个块的矩形范围 rect = fitz.Rect( min(w[0] for w in block_words), min(w[1] for w in block_words), max(w[2] for w in block_words), max(w[3] for w in block_words) )给文本块添加高亮标注
用page.add_highlight_annot()方法给计算出的矩形添加高亮,还可以自定义高亮颜色:if target_block_no is not None: annot = page.add_highlight_annot(rect) # 可选:设置高亮颜色(这里是黄色,RGB值范围0-1) annot.colors = {"stroke": (1.0, 1.0, 0.0)} annot.update()保存修改后的PDF
doc.save("output_highlighted.pdf") doc.close()
注意事项
- 多数PDF中,一个段落对应一个文本块,但部分复杂排版的PDF可能会将段落拆分为多个块,这种情况下需要通过行的位置(比如相邻行的y坐标差)判断哪些块属于同一段落,再合并它们的边界框。
- 如果目标单词在多个段落出现,需要额外逻辑处理(比如遍历所有匹配的块编号,逐个添加高亮)。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

