我的知识记录

Python PDF添加链接注释:点击文字跳转网页

用Python的PyMuPDF给PDF指定区域添加超链接注释,点击直接跳转外部网址或邮箱,也能添加弹出注释(批注),适合在电子书、报告里加引用链接。

场景痛点

做电子书、研究报告、产品手册时,正文里提到"详见官网xx页面",读者还要自己复制网址打开,体验很差。手动在Acrobat里画矩形、填链接,几十上百处链接根本点不过来。用PyMuPDF直接在指定坐标上加链接注释,鼠标一点就跳转,还能加弹窗批注。

用到的库

pip install pymupdf

完整代码

# -*- coding: utf-8 -*-
"""
给 PDF 添加超链接注释和文本注释(批注)。
"""
import fitz  # PyMuPDF
from pathlib import Path


def add_uri_link(pdf_path: str,
output_pdf: str,
page_no: int,
rect: tuple,
uri: str):
"""
在某页指定矩形区域上加一个外部超链接。
rect: (x0, y0, x1, y1),单位是 point,原点在左上角
"""
doc = fitz.open(pdf_path)
page = doc[page_no]  # 页码从 0 开始

link = {
"kind": fitz.LINK_URI,   # 外部网址链接
"from": fitz.Rect(*rect),
"uri": uri,
}
page.insert_link(link)

doc.save(output_pdf, garbage=3, deflate=True)
doc.close()
print(f"已添加链接:{uri} -> 第{page_no+1}页")


def add_text_annotation(pdf_path: str,
output_pdf: str,
page_no: int,
point: tuple,
content: str,
title: str = "批注"):
"""在指定坐标加一个便签式注释,点击弹出内容。"""
doc = fitz.open(pdf_path)
page = doc[page_no]

annot = page.add_text_annot(fitz.Point(*point), content)
annot.set_info(title=title, content=content)
annot.update()

doc.save(output_pdf, garbage=3, deflate=True)
doc.close()
print(f"已添加批注:{content[:20]}...")


def batch_add_company_link(input_pdf: str, output_pdf: str):
"""
实用场景:在每页底部加一个"访问官网"链接区域。
"""
doc = fitz.open(input_pdf)
for page in doc:
rect = fitz.Rect(
page.rect.width - 150, page.rect.height - 30,
page.rect.width - 30, page.rect.height - 10,
)
page.insert_link({
"kind": fitz.LINK_URI,
"from": rect,
"uri": "https://www.example.com",
})
doc.save(output_pdf, garbage=3, deflate=True)
doc.close()
print(f"批量链接完成:{output_pdf}")


if __name__ == "__main__":
# 1) 单页加一个外部链接
add_uri_link(
"input.pdf",
"output_with_link.pdf",
page_no=0,
rect=(100, 700, 400, 720),
uri="https://www.example.com/contact",
)

# 2) 加一个批注
add_text_annotation(
"input.pdf",
"output_with_annot.pdf",
page_no=0,
point=(100, 100),
content="此处数据请财务再核对一遍。",
title="审核提醒",
)

# 3) 批量给每页加官网链接
batch_add_company_link("input.pdf", "output_batch_link.pdf")

代码讲解

  • page.insert_link({...}) 是PyMuPDF加链接的核心方法,字典里kind指定链接类型,LINK_URI是外部网址,LINK_GOTO是跳转到本文档某页,from是可点击的矩形区域。
  • 坐标原点在左上角(PyMuPDF和Acrobat一致,和reportlab不一样),rect格式是(x0, y0, x1, y1)
  • page.add_text_annot(point, content) 加一个黄色便签批注,annot.set_info(title=...) 设置批注作者名,annot.update() 必须调。
  • batch_add_company_link 是实用场景:每页右下角留一小块区域当"访问官网"按钮,读者点一下就跳转。
  • 想让链接区域显示成蓝色下划线文字,先用insert_text写好"点击访问官网",再在文字位置上套一个透明矩形链接。

运行结果

三个函数分别生成三个PDF:第一个第1页有个矩形区域可点跳转到示例网站;第二个第1页左上角有个黄色便签图标,点开能看到批注内容;第三个每页右下角都有个链接区域。用Acrobat或浏览器打开测试点击。

注意事项

  • 链接坐标要自己量好,可以先截图量像素再换算(PDF默认72 DPI,1像素≈1 point),或者用page.search_for("文字")找到文字位置直接套链接。
  • 扫描件PDF也能加链接,链接会盖在图片上。
  • 加密PDF加链接前要先解密,doc.authenticate("密码")
  • 不同阅读器对注释的渲染略有差异,Adobe Reader最完整,手机端微信打开链接一般也能点。

Python PDF添加链接注释:点击文字跳转网页

标签:

更新时间:2026-09-14 21:35:28

上一篇:Python PDF转图片每页高清:PyMuPDF导出PNG教程

下一篇:Python扫描PDF文字OCR识别 图片转文字教程