IText:无法设置 PdfSignatureAppearance 的 СryptoDictionary 属性

IText: cannot set СryptoDictionary property of PdfSignatureAppearance

有一个使用 iTextSharp 的代码:

PdfReader reader = new PdfReader(document);
PdfStamper st = PdfStamper.CreateSignature(reader, new FileStream(document + "_signed.pdf", FileMode.Create, FileAccess.Write), '[=11=]');                        
PdfSignatureAppearance sap = st.SignatureAppearance;

// something

PdfSignature dic = new PdfSignature(filterName, PdfName.ADBE_PKCS7_DETACHED);
sap.CryptoDictionary = dic;

我需要用iText7来写:

PdfReader reader = new PdfReader(@"C:\Users\RakuVIu\Documents\rozha.pdf");
PdfSigner signer = new PdfSigner(reader, new FileStream(document + "_signed.pdf", FileMode.Create), new StampingProperties());
PdfSignatureAppearance appearance = signer.GetSignatureAppearance();

// something

PdfSignature signature = new PdfSignature(filterName, PdfName.Adbe_pkcs7_detached);
appearance.SetCryptoDictionary(signature); // no such method!

所以,我无法设置 CryptoDictionary 属性,因为没有方法或 属性 可以设置。

iText 7 签名 API 试图隐藏自 5.3.x 签名 API 大修后不应再使用的实现细节,签名字典就是这样一个细节。

5.3.x版本引入的签名API详情请阅读iText Digital Signatures white paper. The Java examples in there have been ported to C# and can be accessed here

我参加这个派对有点晚了,但我们在从 iTextSharp 迁移到 iText 7 时遇到了同样的问题。我们使用字典来存储关于签名的额外元数据。幸运的是,iText 仍然通过 ISignatureEvent 接口提供支持。您将必须实现此接口并将其注册到 PdfSigner 对象(通过 SetSignatureEvent(...) 调用)。

简而言之,您的界面实现应如下所示:

public class ClassThatImplementsISignatureEvent: ISignatureEvent
{
  public void GetSignatureDictionary(PdfSignature sig)
  {
    var dict = (PdfDictionary)sig.GetPdfObject();
    dict.Put(new PdfName("SomeData"), new PdfString("SomeValue"));
  }
}

当然,您必须在调用 SignDetached()SignExternalContainer() 之前注册它:

PdfSigner signer = new iText.Signatures.PdfSigner(...);
...
signer.SetSignatureEvent(new ClassThatImplementsISignatureEvent());
...
signer.SignDetached(...)