如何使用itextsharp将数字签名图像或其byte []保存到数据库中?

时间:2018-05-25 06:48:25

标签: c# itext adobe acrobat

我正在处理pdf表单,它包含一个数字签名字段。当我们点击数字签名字段时,它会要求选择有效的签名,然后要求保存文件。 我的要求是根据用户ID将数字签名保存到db。 我有一个pdf格式的按钮,当我们点击该按钮时,它会重定向到处理程序文件。此处理程序类以httpcontext的形式获取数据。在这种情况下,提交按钮后,所有其他文件数据都会到达除数字签名字段之外的处理程序。

有没有办法将数字签名数据读取到处理程序?

提前致谢。

1 个答案:

答案 0 :(得分:2)

首先,

  

此处理程序类以httpcontext的形式获取数据。在这种情况下,提交按钮后,所有其他文件数据都会到达除数字签名字段之外的处理程序。

这听起来像您的PDF表单提交操作设置了 ExportFormat 标志。在这种情况下,数字签名传输。你要么必须设置 SubmitPDF 标志,这会导致提交所有更改的整个文档,或者这两个标志都没有(导致提交FDF),而是 IncludeAppendSaves < / strong>标志,使得提交的FDF文件包含基础PDF文档的所有增量更新的内容。

在服务器端,需要完整的PDF才能继续使用iText高级方法,对于 SubmitPDF ,这正是您所获得的,对于 IncludeAppendSaves ,您必须将其结合起来带有增量更新的原始PDF。

现在您可以提取签名数据。

当您使用名称iTextSharp和标记时,我假设您使用的是5.5.x版本,而不是.x版本的iText。

每当您拥有PDF时,您可以使用GetSignatureNames()属性的AcroFields方法确定其签名的签名字段,该PdfReader属性用于读取文件:

PdfReader reader = new PdfReader(path);
AcroFields fields = reader.AcroFields;
List<String> names = fields.GetSignatureNames();

对于每个此类字段,您可以从字段的签名字典的内容条目中检索实际签名字节:

byte[] signatureBytes = fields.GetSignatureDictionary(name).GetAsString(PdfName.CONTENTS).GetOriginalBytes();

如果是可互操作的ISO 32000-1或PAdES / ISO 32000-2签名,这些字节将包含相当裸的PKCS#1签名结构或CMS签名容器。要真正理解这些结构,通常还需要签名字典中的其他信息。