首页 > 解决方案 > 使用 iText7 锁定文档字段

问题描述

我已经编写了一个代码来使用 iText7 锁定文档中的字段,这些字段被锁定在最终文档中,但是当在 Adob​​e 中打开左签名面板时,那里没有关于字段锁定的信息。

我的代码片段如下:

        PdfSigFieldLock pdfSigFieldLock = new PdfSigFieldLock();
        pdfSigFieldLock.SetDocumentPermissions(PdfSigFieldLock.LockPermissions.NO_CHANGES_ALLOWED);
        string[] fieldToLock = new string[]{ fieldName };
        pdfSigFieldLock.SetFieldLock(PdfSigFieldLock.LockAction.ALL, fieldToLock);
        pdfSigner.SetFieldLockDict(pdfSigFieldLock);

文档字段已锁定,但签名面板中未显示有关文档字段锁定的信息。(预期结果如图所示)

在此处输入图像描述

标签: c#.netpdfitext7

解决方案


请尝试从Lock字典中删除字段:

PdfSigFieldLock pdfSigFieldLock = new PdfSigFieldLock();
pdfSigFieldLock.SetDocumentPermissions(PdfSigFieldLock.LockPermissions.NO_CHANGES_ALLOWED);
string[] fieldToLock = new string[]{ fieldName };
pdfSigFieldLock.SetFieldLock(PdfSigFieldLock.LockAction.ALL, fieldToLock);
pdfSigFieldLock.GetPdfObject().Remove(PdfName.Fields); // <<<<
pdfSigner.SetFieldLockDict(pdfSigFieldLock);

在我的测试中,我确实文档被 SH_SIGNATURE_417868 锁定通过该更改获得了所需的输出。

一些背景:

如果Action的值为 Include 或 Exclude ,则该Fields条目被指定为必需(ISO 32000-1,表 233 - 签名字段锁定字典中的条目)。因此,在您的情况下的所有操作的情况下,它既不是必需的,也不是可选的。此外,在这种情况下也没有任何意义,因为无论如何都应该锁定所有字段。因此,Adobe Reader 显然考虑了一个签名字段锁定字典,其中包含一个字段条目动作不正确。(好吧,如果包含文档的所有字段名称,它可能会接受该条目,我没有检查所有可能的内容......)

PdfSigFieldLock不幸的是,iText 7 类目前会自动创建这样一个Fields,因此您必须将其删除。


推荐阅读