pdf签名上的自定义词典项目

时间:2018-02-23 16:22:50

标签: c# itext sign

我正在使用iTextSharp 5签署一份pdf文档。这是按预期工作的。我现在正在尝试向签名添加一些自定义属性(字典项)。

PdfStamper st = PdfStamper.CreateSignature(reader, signedPdf, '\0', null, true);
PdfSignatureAppearance sap = st.SignatureAppearance;

// Adding the custom properties
PdfDictionary dict = new PdfDictionary();
dict.Put(new PdfName("SomeKey"), new PdfString("SomeValue"));
// ... more keys and values
sap.CryptoDictionary = dict;

// to make some of the parameters clear, these are the types. 
// implementation was skipped for clarity, but is already working in our product though
ITSAClient tsaClient = ...
ICollection<ICrlClient> crlClients = ...
IOcspClient ocspClient = ...
IExternalSignature externalSignature = ...

// adding the signature to the document
MakeSignature.SignDetached(sap, externalSignature, chain, crlClients, ocspClient, tsaClient,
                        certSize, CryptoStandard.CMS);

我尝试使用RUPS在文档中查找我的额外属性,但我无法找到它们。

此外,再次打开pdf时,使用以下代码无法找到数据(但我显然无法确认这是该作业的正确代码):

PdfDictionary sigDict = reader.AcroFields.GetSignatureDictionary(signature name);

当然我可以将我的属性序列化为json并将它们放在隐藏的文本字段中,这就是我的后备场景。但我必须使用签名等保护该字段。我认为这种方法更像是pdf的实际设计方式。

对于此特定产品,由于不祥原因,无法升级到iText 7。但是我们有一个更新的产品,我需要在以后使用iText 7添加相同的功能。

是否有人知道这是否是正确的做法以及我缺少的是什么?我无法在pdf词典中结合签名找到好的编码示例。

1 个答案:

答案 0 :(得分:0)

您可以在字典中设置自定义键,然后将其分配给签名外观的use feature 'switch';

no warnings qw/ experimental::smartmatch /;

稍后您调用CryptoDictionary实用程序方法:

PdfDictionary dict = new PdfDictionary();
dict.Put(new PdfName("SomeKey"), new PdfString("SomeValue"));
// ... more keys and values
sap.CryptoDictionary = dict;

不幸的是(对你而言),SignDetached本身会创建一个新词典,最终分配给签名外观的MakeSignature.SignDetached(sap, externalSignature, chain, crlClients, ocspClient, tsaClient, certSize, CryptoStandard.CMS);

MakeSignature.SignDetached

因此,您的字典及其自定义值将被删除!

要将自定义值添加到签名值字典,您必须更改方法。你可以

  • CryptoDictionary中的整个代码复制到您的代码中,并添加自定义键和值;或
  • 使用PdfSignature dic = new PdfSignature(PdfName.ADOBE_PPKLITE, sigtype == CryptoStandard.CADES ? PdfName.ETSI_CADES_DETACHED : PdfName.ADBE_PKCS7_DETACHED); dic.Reason = sap.Reason; dic.Location = sap.Location; dic.SignatureCreator = sap.SignatureCreator; dic.Contact = sap.Contact; dic.Date = new PdfDate(sap.SignDate); // time-stamp will over-rule this sap.CryptoDictionary = dic; 代替MakeSignature.SignDetached。该实用程序方法被赋予MakeSignature.SignExternalContainer实现而不是MakeSignature.SignDetached实现和其他参数,并且该接口具有回调方法

    IExternalSignatureContainer

    您可以在此处添加自定义键。但是,显然,您还必须将IExternalSignature中的一些代码复制到/** * Modifies the signature dictionary to suit the container. At least the keys PdfName.FILTER and * PdfName.SUBFILTER will have to be set. * @param signDic the signature dictionary */ void ModifySigningDictionary(PdfDictionary signDic); 实现中。

如果您不清楚MakeSignature.SignDetached中的代码及其含义,那么前一选项将更容易。另一方面,后一种选择会更加清晰,因为它允许您在实用程序方法中留下一些低级细节。