如何使用PyMuPDF高亮PDF中存在Unicode问题的目标文本块?
解决PyMuPDF文本匹配与高亮失败问题
核心问题分析
你的代码失败主要有两个原因:
- 硬编码文本中的
�是Unicode识别失败的占位符,并非PDF页面中的真实字符(实际可能是项目符号如•,对应Unicode\u2022)。 - PDF中的换行、空格排版和你手动编写的
\n不一致,精确匹配时无法对应。
解决方案
步骤1:确认PDF页面的真实文本内容
先打印页面文本的原始表示,明确真实字符和排版:
import fitz doc = fitz.open("/Users/abc.pdf") page = doc.load_page(13) # 用repr()查看转义字符和真实Unicode编码 print(repr(page.get_text())) doc.close()
运行后你会看到实际的项目符号(比如\u2022)和换行/空格的真实情况。
步骤2:使用正则表达式模糊匹配
利用PyMuPDF的正则搜索功能,适配排版差异和未知字符:
import fitz doc = fitz.open("/Users/abc.pdf") page = doc.load_page(13) # 根据步骤1得到的真实字符,构建正则表达式 # \s+匹配任意空白(换行、空格、制表符),\u2022替换占位符� search_pattern = r"cancer\. Your team should include the following\s+board-certified experts:\s+\u2022 A pulmonologist is a doctor who’s an\s+expert of lung diseases\.\s+\u2022 A thoracic radiologist is a doctor who’s\s+an expert of imaging of the chest" # 启用正则搜索模式 quads = page.search_for(search_pattern, flags=fitz.TEXT_SEARCH_REGEX, quads=True) # 批量添加高亮 for quad in quads: page.add_highlight_annot(quad) # 保存修改后的PDF doc.save("/Users/abc_highlighted.pdf") doc.close()
步骤3:拆分段落逐个搜索(备选方案)
如果正则匹配复杂,可将文本拆分为独立段落,分别搜索后合并结果:
import fitz doc = fitz.open("/Users/abc.pdf") page = doc.load_page(13) # 拆分目标文本为独立语义段 search_segments = [ "cancer. Your team should include the following board-certified experts:", "A pulmonologist is a doctor who’s an expert of lung diseases.", "A thoracic radiologist is a doctor who’s an expert of imaging of the chest" ] all_quads = [] for segment in search_segments: # 搜索每个段落 segment_quads = page.search_for(segment, quads=True) all_quads.extend(segment_quads) # 为所有匹配区域添加高亮 for quad in all_quads: page.add_highlight_annot(quad) doc.save("/Users/abc_highlighted.pdf") doc.close()
内容的提问来源于stack exchange,提问作者Baktaawar
相关产品推荐
相关产品推荐

