2014-01-28 178 views
0

我正在写一个服务,其中我用一个空容器对PDF文件进行了预签名,从pdf文件中取一个字节范围的哈希值并将其发送到另一个服务,将允许用户使用移动电话签名哈希。我将取回一张证书,我将在预签署的pdf文件中注入签名容器。使用iTextSharp签署pdf文件后更改签名外观

一切工作到目前为止,除了我想在文档中有可见的签名。可见签名需要证书才能从中获取信息(例如谁签名和何时签名),但似乎需要在实际签名之前添加可见签名。

我的问题是,是否可以在签名后更改文档中签名的外观?可见签名图像似乎超出了文档的有符号字节范围。

我前签署文件,一个空白的容器:

IExternalSignatureContainer external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE,                     PdfName.ETSI_CADES_DETACHED); 
MakeSignature.SignExternalContainer(_sap, external, 8192 * 2); 

哪里_sap是从压模SignatureAppearance初始化方式如下:

PdfStamper stamper = PdfStamper.CreateSignature(reader, baos, '\0', null, true); 

的返回BYTERANGE的哈希来自SignatureAppearance:

Stream data = _sap.GetRangeStream(); 
_hash = DigestAlgorithms.Digest(data, DigestAlgorithms.SHA1); 
_hashStr = Convert.ToBase64String(_hash); 
return _hashStr; 

然后当我得到的认证创建自定义容器:

IExternalSignatureContainer container = new CustomContainer(cert); 
MakeSignature.SignDeferred(reader, _signatureFieldName, baos, container); 

自定义容器没有做任何事情,除了返回cert在它的public byte[] Sign(Stream data)方法。

签名本身起作用,数字签名是有效的,但我只需要更改可见签名本身的文本。我认为这是可能的,因为可见签名实际上与证书本身没有任何关系,只是方便地显示证书中的名称,特别是使用多个签名。

+0

我已经多次阅读过这个问题,但我不太清楚,签名后为什么必须更改签名的呈现方式。用户证书在实际签名之前是可用的,因此所有需要的信息都可以在准备步骤中添加到可视化演示中,以消除与签署后更改任何内容有关的所有问题 – divanov

回答

4

你是对的当你写道:似乎我需要添加可见的签名之前,我实际上签署它。你错了,当你写道:我会认为这是可能的。

签名的外观由存储在PDF文档中的字典和流组成。这些对象是散列并随后签名的字节的一部分。您不能在不破坏签名的情况下更改这些字节。

+2

但是,可以尝试的操作是在准备位于签名可视化上方的签名的pdf时添加文本字段。签署文件后,他可以填写这些字段在一个补充修订...;) – mkl

+1

好建议由mkl! –

+0

感谢布鲁诺,这就是我的想法。 感谢mkl,我无意中会尝试一下,那可能正是我需要的。 –