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

使用iText7在Java中填充纯文本域后锁定PDF的可行性咨询

使用iText7填充纯文本表单域后锁定PDF的可行方案

纯文本表单域本身没有像签名域那样绑定PdfSigFieldLock的原生机制,因为PdfSigFieldLock是专门配合数字签名的权限控制工具。不过可以通过两种方案实现填充后锁定的效果:

方案一:直接设置文本域为只读

填充内容后修改域的属性,将其设为不可编辑,操作简单但安全性一般(用户可通过编辑工具手动解除只读)。

代码示例:

PdfDocument pdfDoc = new PdfDocument(new PdfReader("input.pdf"), new PdfWriter("output.pdf"));
PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);

// 获取目标纯文本域并填充内容
PdfTextFormField textField = (PdfTextFormField) form.getField("targetTextField");
textField.setValue("需要填充的内容");

// 设置域为只读
textField.setReadOnly(true);

// 刷新表单,保留域结构(若要彻底转为普通文本,可将参数设为true)
form.flattenFields(false);

pdfDoc.close();

方案二:通过临时签名域触发严格锁定

如果需要防止用户手动解除锁定,可借助签名机制:创建一个不可见的签名域,填充文本域后完成自签名,同时用PdfSigFieldLock设置锁定规则,这种方式安全性更高(修改会破坏签名完整性)。

代码示例:

PdfDocument pdfDoc = new PdfDocument(new PdfReader("input.pdf"), new PdfWriter("temp.pdf"));
PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);

// 1. 填充目标纯文本域
PdfTextFormField textField = (PdfTextFormField) form.getField("targetTextField");
textField.setValue("需要填充的内容");

// 2. 创建不可见的签名域
PdfSignatureField sigField = PdfFormField.createSignature(pdfDoc);
sigField.setFieldName("invisibleSig");
sigField.setPage(1);
// 设置极小的矩形,确保视觉不可见
sigField.setWidgetRectangle(new Rectangle(0, 0, 1, 1));
form.addField(sigField);

// 3. 配置锁定规则:可选择锁定指定域或整个文档
PdfSigFieldLock lock = new PdfSigFieldLock();
// 禁止任何文档更改(包括表单域编辑)
lock.setDocumentPermissions(PdfSigFieldLock.LockPermissions.NO_CHANGES);
// 若仅需锁定目标文本域,可替换为:
// lock.setLockedFields(Collections.singletonList("targetTextField"));
sigField.setSigFieldLock(lock);

pdfDoc.close();

// 4. 对临时PDF进行自签名(需替换为实际的私钥和证书链)
PdfSigner signer = new PdfSigner(new PdfReader("temp.pdf"), new FileOutputStream("locked_output.pdf"), new StampingProperties());
signer.setFieldName("invisibleSig");
// 设置认证级别为允许表单填充和注释(此处仅为示例,可按需调整)
signer.setCertificationLevel(PdfSigner.CERTIFIED_FORM_FILLING_AND_ANNOTATIONS);

// 加载私钥和证书链(需自行实现获取逻辑)
PrivateKey privateKey = getYourPrivateKey();
Certificate[] certChain = getYourCertificateChain();

IExternalSignature signature = new PrivateKeySignature(privateKey, DigestAlgorithms.SHA256, null);
IExternalDigest digest = new BouncyCastleDigest();

// 完成分离式签名
signer.signDetached(digest, signature, certChain, null, null, null, 0, PdfSigner.CryptoStandard.CMS);

方案选择建议

  • 若仅需基础的编辑限制,方案一足够;
  • 若需要确保文档不可篡改,优先选择方案二(需准备数字证书)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:32:36