对PDF文件签名是移动设备上越来越普遍的使用需求,本文将描述自动生成/“手绘”签名与如何使用DevExpress Office File API组件来实现在.NET MAUI应用程序中快速合并签名/签名支持之间的区别。
DevExpress Office File API是一个专为C#, VB.NET 和 ASP.NET等开发人员提供的非可视化.NET库。有了这个库,不用安装Microsoft Office,就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CSV 和 Snap Report等企业级文件。
获取DevExpress Office File API v23.1正式版下载(Q技术交流:909157416)
电子 VS 手绘PDF签名区别
虽然这两种类型的签名都很相似,但它们在功能/实践上存在差异。
电子签名(e-sign)使用加密方法来确认文件是从特定的源发送的,并且在发送后没有被更改。下面的列表描述了使用电子签名签名文件时执行的简化操作顺序:
1. 发送方计算他们想要发送的PDF文件的哈希码。
2. 发送方创建一个公钥/私钥对,并用私钥加密哈希码。
3. 发送方发送PDF文件、加密的哈希码(签名)、公钥和证书,证书包含发件人的信息,接收方可以用它来确认公钥的真实性。
4. 接收方用公钥解密加密的哈希码(签名),计算文档的哈希码,并比较这些哈希。
5. 如果它们相等,则该文件是真实的。如果文件被修改,则文档哈希码将与使用签名中的公钥解密的哈希码不匹配。
为了获得额外的保护,您可以使用认证服务。这些服务有助于确保公钥属于发送文档的用户。
手绘签名很像纸上的“湿”签名,在PDF的情况下,它只是一个图像插入到文档的特定区域。您可以将这两种签名类型结合起来,以确认手绘签名的真实性。
添加PDF签名
DevExpress Office File API包含设计用于处理不同文档类型(PDF, Word, Excel, HTML)的类,在本文中,我们将使用Office File API对PDF文件进行签名,其中包含了刚才提到的两种签名类型。
PdfDocumentProcessor类是PDF文件修改的入口点,在这个项目中,我们使用了这个类的以下成员:
- PdfDocumentProcessor.LoadDocument方法:从文件系统加载PDF文件。
- DocumentFacade属性:返回一个PdfDocumentFacade 对象,该对象提供对文档的acroform字段的访问。
- SaveDocument方法:保存签名后的PDF文件。
Android和iOS应用都是沙盒式的,他们对设备文件系统的访问权限有限。要处理应用程序包文件,需要将它们复制到Cache或AppDataDirectory(在本例中使用)文件夹中。在我们的例子中,这些文件是PDF和PFX证书文件。下面的代码示例定义了将指定的PDF文件从应用程序包复制到AppDataDirectory文件夹的方法:
public async Task<string> CopyWorkingFilesToAppData(string fileName) {
using Stream fileStream = await FileSystem.Current.OpenAppPackageFileAsync(fileName);
string targetFile = Path.Combine(FileSystem.Current.AppDataDirectory, fileName);
using FileStream outputStream = File.OpenWrite(targetFile);
fileStream.CopyTo(outputStream);
return targetFile;
}
一旦实现,您就可以使用PdfDocumentProcessor.LoadDocument 方法打开PDF文件。
DevExpress Office File API允许您检测PDF AcroForm字段并根据需要填充它们,我们使用以下成员来定位第一个可用的签名字段:
- PdfAcroFormFacade.GetFields方法:定位PDF文件中的所有字段。
- PdfFormFieldFacade.Type属性:用于定位签名字段。
在这个特殊的使用场景中,PdfSignatureBuilder是另一个重要的类。它存储了签名本身的以下信息:
- PFX证书文件。有关如何创建PFX证书的详细信息,请参阅以下Microsoft帮助主题:Create PFX certificate profiles using a certificate authority。
- 签署文件人的地点
- 签署文件人的姓名
- 签署文件的原因
- PDF文件中嵌入的签名图像
用户可以“绘制”一个签名,并将其嵌入到PDF文件中,这是通过使用DrawingView控件实现的。顾名思义,该控件可以将用户的绘图保存为图像——稍后我们将图像传递给PdfSignatureBuilder。
一旦文档被签名, PdfDocumentProcessor.SaveDocument方法保存签名的PDF文件。