首页 > 解决方案 > 如何使用 itextsharp 将数字签名图像或其字节 [] 保存到数据库中?

问题描述

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

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

提前致谢。

标签: c#itextadobeacrobat

解决方案


首先,

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

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

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

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

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

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

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 签名容器。要真正理解这些结构,您通常还需要来自签名字典的附加信息。


推荐阅读