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

如何使用PyPDF2对PDF中的选定文本添加高亮标注

Python实现PDF指定文本高亮的可行方案

你没有遗漏PyPDF2的相关用法——截止当前最新稳定版,PyPDF2本身就没有提供「自动搜索指定文本、匹配对应坐标、添加高亮注释」的完整封装能力,不用再反复翻文档找了。它对注释的支持仅覆盖读取、删除已有注释,以及传入手动提前获取的坐标创建注释的基础能力,没法直接满足你自动高亮指定文本(比如论文作者区域)的需求。

PyPDF2实现高亮的实际局限

如果硬要用PyPDF2做高亮,你需要自己完成全流程的坐标获取工作,再手动构造符合PDF规范的高亮注释对象插入页面,步骤繁琐且容错率极低:

  • 你需要先通过其他工具拿到目标文本在页面上的精确边界框坐标,遇到文本换行、字体偏移、分栏排版的情况很容易出现高亮错位的问题
  • 手动构造注释的代码逻辑冗余,不同版本PyPDF2对底层通用对象的封装有差异,版本升级很容易导致原有代码失效
  • 基础实现代码参考:
from PyPDF2 import PdfReader, PdfWriter
from PyPDF2.generic import DictionaryObject, NameObject, NumberObject, FloatObject, ArrayObject

reader = PdfReader("target_paper.pdf")
writer = PdfWriter()
target_page = reader.pages[0]
writer.add_page(target_page)

# 注意:以下坐标需要你提前通过其他方式获取,PyPDF2无法自动匹配文本位置
x0, y0, x1, y1 = 90, 710, 320, 730
highlight_annot = DictionaryObject()
highlight_annot.update({
    NameObject("/Type"): NameObject("/Annot"),
    NameObject("/Subtype"): NameObject("/Highlight"),
    NameObject("/Rect"): ArrayObject([FloatObject(x0), FloatObject(y0), FloatObject(x1), FloatObject(y1)]),
    NameObject("/QuadPoints"): ArrayObject([
        FloatObject(x0), FloatObject(y1), FloatObject(x1), FloatObject(y1),
        FloatObject(x0), FloatObject(y0), FloatObject(x1), FloatObject(y0)
    ]),
    NameObject("/C"): ArrayObject([FloatObject(1), FloatObject(1), FloatObject(0)]), # 标准黄色高亮
    NameObject("/CA"): NumberObject(0.8) # 高亮透明度
})

if "/Annots" in target_page:
    target_page[NameObject("/Annots")].append(highlight_annot)
else:
    target_page[NameObject("/Annots")] = ArrayObject([highlight_annot])

with open("highlighted_paper.pdf", "wb") as f:
    writer.write(f)

上述代码仅适合坐标完全固定的批量处理场景,只要PDF排版有细微调整,高亮位置就会出错,不推荐通用场景使用。

更适合文本高亮需求的Python库

如果要实现「输入指定文本自动定位加高亮」的需求,优先选下面几个成熟库,不用自己造底层的轮子:

  • PyMuPDF(导入名为fitz):是目前处理这类需求效率最高、代码量最少的选择,原生内置文本搜索、坐标匹配、注释添加的全流程能力,对常规电子PDF(非扫描件)的适配性极好,处理学术论文作者栏这类场景只需要几行代码:
import fitz # 安装时执行pip install pymupdf即可

doc = fitz.open("academic_paper.pdf")
first_page = doc[0] # 作者信息通常在论文首页
target_text = "作者名1, 作者名2, 作者名3"
# 自动搜索页面内所有匹配文本的区域
match_regions = first_page.search_for(target_text)
# 给所有匹配区域加高亮
for region in match_regions:
    first_page.add_highlight_annot(region)
doc.save("paper_with_author_highlight.pdf")

除了基础高亮,这个库还支持调整高亮颜色、透明度、关联批注内容,足够覆盖绝大多数PDF注释相关的需求。

  • pdfplumber + PyPDF2/pikepdf组合:如果你已经基于PyPDF2搭了一部分PDF处理流程,不想整体替换库,可以用pdfplumber做高精度的文本坐标提取,拿到目标文本的边界框之后,再传给PyPDF2或者pikepdf完成注释插入。其中pikepdf对PDF底层结构的操作稳定性比PyPDF2更好,适合需要批量定制注释属性的场景。
  • 额外提醒:如果你的PDF是扫描件(本质是内嵌图片,没有可直接提取的文本层),上述库都无法直接定位文本,需要先通过OCR工具(比如pytesseract、PaddleOCR)识别出文本对应的坐标,再叠加高亮注释。

内容的提问来源于stack exchange,提问作者NukEyyou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:09:30