使用 iText7 锁定文档字段

Document field locking using 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);

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

请尝试从 Lock 字典中删除 Fields

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);

在我的测试中,我确实得到了所需的输出 并进行了更改。

部分背景:

如果 Action 的值为 Include 或 Exclude[=39=,则 Fields 条目被指定为 Required ](ISO 32000-1,Table 233 – 签名字段锁定字典中的条目)。因此,对于您的情况下的 All 操作,它是 neither 必需的 nor 可选的。此外,在那种情况下也没有意义,因为无论如何 all 字段都应被锁定。因此,Adobe Reader 显然认为带有 Fields 条目的签名字段锁定字典用于 All 操作不正确。 (好吧,如果包含文档的所有字段名称,它可能会接受该条目,我没有检查所有可能的内容...)

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

以上场景可以通过手动给PdfSigFieldLock字典添加值来实现。 这是代码片段:

        PdfDictionary lockDictionary = new PdfDictionary();
        lockDictionary.Put(PdfName.Action, new PdfName("All"));
        lockDictionary.Put(PdfName.P, new PdfNumber(1));

        PdfSigFieldLock pdfSigFieldLock = new PdfSigFieldLock(lockDictionary);
        pdfSigner.SetFieldLockDict(pdfSigFieldLock);