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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:35:03