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(...)
有一个使用 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(...)