c# - 如何使用 itextsharp 将数字签名图像或其字节 [] 保存到数据库中?
问题描述
我正在处理一个 pdf 表单,它包含一个数字签名字段。当我们点击数字签名字段时,它会要求选择一个有效的签名,然后它会要求保存文件。我的要求是根据用户 ID 将数字签名保存到 db。我在 pdf 表单中有一个按钮,当我们单击该按钮时,它会重定向到处理程序文件。这个处理程序类以 httpcontext 的形式获取数据。在这种情况下,提交按钮后,除数字签名字段外,所有其他字段数据都到达处理程序。
有没有办法将数字签名数据读取到处理程序?
提前致谢。
解决方案
首先,
这个处理程序类以 httpcontext 的形式获取数据。在这种情况下,提交按钮后,除数字签名字段外,所有其他字段数据都到达处理程序。
这听起来像您的 PDF 表单提交操作设置了ExportFormat标志。在这种情况下,不传输数字签名。您要么必须设置SubmitPDF标志,这会导致提交包含所有更改的整个文档,或者这两个标志都不(导致提交 FDF),而是设置IncludeAppendSaves标志,导致提交的 FDF 文件包含内容对基础 PDF 文档的所有增量更新。
在服务器端,需要完整的 PDF 才能继续使用 iText 高级方法,对于SubmitPDF,这正是您所得到的,对于IncludeAppendSaves,您必须将原始 PDF 与增量更新结合起来。
现在您可以提取签名数据。
当您使用名称 iTextSharp 和itext标记时,我假设您使用的是 5.5.x 版本,而不是 .Net 的 7.x 版本的 iText。
每当您拥有 PDF 时,您都可以使用您用于读取文件的 a 属性的GetSignatureNames()
方法来确定其签名的签名字段:AcroFields
PdfReader
PdfReader reader = new PdfReader(path);
AcroFields fields = reader.AcroFields;
List<String> names = fields.GetSignatureNames();
对于每个这样的字段,您可以从该字段的签名字典的Contents条目中检索实际的签名字节:
byte[] signatureBytes = fields.GetSignatureDictionary(name).GetAsString(PdfName.CONTENTS).GetOriginalBytes();
在可互操作的 ISO 32000-1 或 PAdES/ISO 32000-2 签名的情况下,这些字节将包含相当裸露的 PKCS#1 签名结构或 CMS 签名容器。要真正理解这些结构,您通常还需要来自签名字典的附加信息。