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

如何使用PyMuPDF自动将图片插入PDF的附件按钮控件对应位置

PyMuPDF自动填充PDF附件按钮插入图片方案

核心实现逻辑

你提到的可点击上传的附件框属于PDF表单的按钮组件,绑定了文件选择的交互动作。我们可以通过定位按钮的坐标、删除原有空按钮、在相同位置嵌入图片类型的文件附件注解,实现和手动点击上传完全一致的效果。

实现步骤

1. 安装指定版本依赖

选择兼容性较好的PyMuPDF版本,避免API变动导致报错:

pip install pymupdf==1.23.21

2. 完整代码示例

import fitz  # PyMuPDF的导入名

# 配置参数
pdf_path = "你的原文件.pdf"
output_path = "插入附件后的文件.pdf"
# 按你6个附件框的顺序,对应要插入的图片路径列表
img_paths = [
    "img1.png",
    "img2.png",
    # 按实际数量补充到6个
]

doc = fitz.open(pdf_path)
# 收集所有页面的按钮widget,按顺序排列
all_btns = []
for page in doc:
    # 筛选类型为按钮的widget
    btn_widgets = [w for w in page.widgets() if w.field_type == fitz.PDF_WIDGET_TYPE_BUTTON]
    all_btns.extend(btn_widgets)

# 校验按钮数量和图片数量匹配
assert len(all_btns) == len(img_paths), f"按钮数量{len(all_btns)}和图片数量{len(img_paths)}不匹配"

for idx, btn in enumerate(all_btns):
    page = doc[btn.page]
    # 读取图片字节
    with open(img_paths[idx], "rb") as f:
        img_bytes = f.read()
    # 在原按钮的相同位置添加文件附件注解
    page.add_file_annot(
        rect=btn.rect,  # 完全复用原按钮的坐标
        content=img_bytes,
        filename=img_paths[idx].split("/")[-1],  # 附件显示的文件名
        desc="插入的图片附件",
        icon="Graph",  # 图标设为图片类型,和你截图里的附件图标一致
    )
    # 删除原有空白按钮
    btn.delete()

# 保存文件,不要用增量保存避免表单残留问题
doc.save(output_path, incremental=False, garbage=4, deflate=True)
doc.close()

常见问题排查

  • 插入后附件图标大小不对:可以手动调整add_file_annot的rect参数,对原按钮的坐标做小幅缩放
  • 附件无法打开:检查读取图片的字节是否完整,文件名不要包含特殊字符
  • 高版本PyMuPDF报错:把add_file_annot替换为annot_file,参数逻辑完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:27:03