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

如何使用PyMuPDF实现不同PDF文档间的注释迁移

PyMuPDF 跨文档迁移PDF注释实现方案

基础迁移实现(兼容BlueBeam标记)

你要的注释迁移功能PyMuPDF完全支持,核心逻辑是提取源注释的所有属性后在目标文档对应页面重建,不需要手动调整位置,只要两份PDF的页面尺寸完全一致即可保证坐标匹配。
示例代码如下:

import fitz  # PyMuPDF 正式导入名

# 加载源文档(带BlueBeam标记)和目标文档(待合并标记的基底文档)
src_pdf = fitz.open("source_with_annot.pdf")
dst_pdf = fitz.open("target_base.pdf")

# 可根据实际场景调整页数校验逻辑,比如只迁移指定页的注释
if len(src_pdf) != len(dst_pdf):
    raise ValueError("源文档与目标文档页数不匹配,请核对后重试")

for page_num in range(len(src_pdf)):
    src_page = src_pdf[page_num]
    dst_page = dst_pdf[page_num]
    # 遍历当前页所有注释
    for src_annot in src_page.annots():
        # 提取注释基础属性
        annot_type = src_annot.type[0]
        annot_bound = src_annot.rect
        # 在目标页创建同类型注释
        new_annot = dst_page.add_annot(annot_type, annot_bound)
        # 同步原注释的所有元信息:内容、作者、创建时间、颜色、透明度等
        new_annot.set_info(src_annot.info)
        # 同步注释外观流,保证手绘、箭头、自定义图章等特殊标记显示正常
        if src_annot.ap:
            new_annot.set_appearance(src_annot.ap())
        # 保存当前注释修改
        new_annot.update()

# 导出最终文件,garbage参数清理冗余资源,deflate压缩文件体积
dst_pdf.save("merged_annot.pdf", garbage=4, deflate=True)

进阶功能实现

修改注释name属性

在注释创建完成后、调用update()方法前,添加一行代码即可修改:

new_annot.set_name("自定义注释名称")

注释分配到不同图层

PyMuPDF中的图层对应可选内容组(OCG),你可以先按分类创建图层,再把对应注释关联到目标图层即可:

# 示例:按标记生成时间创建两个图层
layer_q1 = dst_pdf.add_ocg("2024年第一季度标记")
layer_q2 = dst_pdf.add_ocg("2024年第二季度标记")

# 给注释关联对应图层,可根据原注释的创建时间判断分配逻辑
new_annot.set_ocg(layer_q1)

注意事项

  • 必须保证源文档和目标文档的页面MediaBox尺寸完全一致,否则会出现注释位置偏移,如有尺寸差异可先通过Page.set_mediabox()统一目标文档的页面尺寸再执行迁移
  • 若BlueBeam自定义标记存在特殊嵌入资源,保存时添加pretty=True参数可避免资源丢失

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:57:03