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最完整,手机端微信打开链接一般也能点。

更新时间:2026-09-14 21:35:28
上一篇:Python PDF转图片每页高清:PyMuPDF导出PNG教程