我正在处理pdf表单,它包含一个数字签名字段。当我们点击数字签名字段时,它会要求选择有效的签名,然后要求保存文件。 我的要求是根据用户ID将数字签名保存到db。 我有一个pdf格式的按钮,当我们点击该按钮时,它会重定向到处理程序文件。此处理程序类以httpcontext的形式获取数据。在这种情况下,提交按钮后,所有其他文件数据都会到达除数字签名字段之外的处理程序。
有没有办法将数字签名数据读取到处理程序?
提前致谢。
答案 0 :(得分:2)
首先,
此处理程序类以httpcontext的形式获取数据。在这种情况下,提交按钮后,所有其他文件数据都会到达除数字签名字段之外的处理程序。
这听起来像您的PDF表单提交操作设置了 ExportFormat 标志。在这种情况下,数字签名不传输。你要么必须设置 SubmitPDF 标志,这会导致提交所有更改的整个文档,或者这两个标志都没有(导致提交FDF),而是 IncludeAppendSaves < / strong>标志,使得提交的FDF文件包含基础PDF文档的所有增量更新的内容。
在服务器端,需要完整的PDF才能继续使用iText高级方法,对于 SubmitPDF ,这正是您所获得的,对于 IncludeAppendSaves ,您必须将其结合起来带有增量更新的原始PDF。
现在您可以提取签名数据。
当您使用名称iTextSharp和itext标记时,我假设您使用的是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签名容器。要真正理解这些结构,通常还需要签名字典中的其他信息。