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

如何使用pdfkit为PDF添加Lock字典以实现签名字段锁定?

使用PDFKit实现签名字段的锁定控制(多签名场景)

我已经成功用pdfkit生成带签名字段的PDF,基础代码如下:

const formSig = ((pdfDoc, name, x, y, w, h, options = {}) => {
    const annotOptions = {
        ...options,
        FT: 'Sig',
    }
    pdfDoc.formAnnotation(name, null, x, y, w, h, annotOptions)
});

现在需要实现签名时锁定指定字段,支持多签名需求。已知需要两步操作,但不清楚具体实现:

  1. 创建一个Type为SigFieldLock、Action为Include、Fields为目标字段名数组的签名字段锁字典;
  2. 给签名字段添加指向该锁字典的Lock条目。

之前尝试创建字典并获取引用,但字典没有写入PDF流中,以下是正确的实现方式:

实现步骤

  1. 创建SigFieldLock字典并确保写入流
    PDFKit的ref()方法可以创建可引用的字典对象,必须手动调用end()方法将其写入文档流,否则字典不会被包含到最终PDF中。

  2. 将锁字典关联到签名字段
    在创建签名字段的annotOptions中添加Lock属性,值为锁字典的引用对象。

完整代码示例

const createSignatureFieldWithLock = (pdfDoc, sigName, x, y, w, h, lockedFields = [], options = {}) => {
    // 1. 创建SigFieldLock字典
    const lockRef = pdfDoc.ref({
        Type: 'SigFieldLock',
        Action: 'Include', // 可选值:Exclude(排除指定字段)/Include(仅锁定指定字段)/All(锁定所有字段)
        Fields: lockedFields // 需要锁定的字段名数组
    });
    // 必须调用end()将字典写入文档流,否则不会被包含到PDF中
    lockRef.end();

    // 2. 创建带Lock引用的签名字段
    const annotOptions = {
        ...options,
        FT: 'Sig',
        Lock: lockRef // 关联锁字典引用
    };
    pdfDoc.formAnnotation(sigName, null, x, y, w, h, annotOptions);
};

// 使用示例:创建两个签名字段,分别锁定不同字段
// 先创建普通表单字段(示例)
pdfDoc.textField('field1', 50, 100, 200, 20);
pdfDoc.textField('field2', 50, 150, 200, 20);

// 创建带锁定规则的签名字段
createSignatureFieldWithLock(pdfDoc, 'sig1', 50, 200, 200, 50, ['field1']);
createSignatureFieldWithLock(pdfDoc, 'sig2', 50, 280, 200, 50, ['field2']);

关键说明

  • Action参数的三种可选逻辑:
    • Include:签名后仅锁定Fields数组中的字段
    • Exclude:签名后锁定除Fields数组外的所有字段
    • All:签名后锁定所有表单字段
  • 必须调用lockRef.end():这是解决字典未写入PDF流的核心操作,PDFKit通过ref()创建的对象不会自动写入文档,手动调用end()才能完成持久化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 01:24:30