如何使用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) });
现在需要实现签名时锁定指定字段,支持多签名需求。已知需要两步操作,但不清楚具体实现:
- 创建一个
Type为SigFieldLock、Action为Include、Fields为目标字段名数组的签名字段锁字典; - 给签名字段添加指向该锁字典的
Lock条目。
之前尝试创建字典并获取引用,但字典没有写入PDF流中,以下是正确的实现方式:
实现步骤
创建SigFieldLock字典并确保写入流
PDFKit的ref()方法可以创建可引用的字典对象,必须手动调用end()方法将其写入文档流,否则字典不会被包含到最终PDF中。将锁字典关联到签名字段
在创建签名字段的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
相关产品推荐
相关产品推荐

