以PDF格式保存的电子交易文件或合同,即使具有数字签名,仍然不能完全保证该文件的法律效力,因为数字证书存在有效期和可随时吊销的问题。为了解决这一问题,出现了一种改进的基于时间戳的数字签名方案,即在数字签名的基础上打上一个可信赖的时间戳。
这篇将介绍如何使用.NET PDF组件Spire.PDF for .NET在C#应用程序中给PDF文档添加数字签名并打上时间戳(注意这里的时间戳必须符合RFC 3161标准)。
引用DLL
在使用以下代码前,需要引用Spire.PDF for .NET组件的DLL文件到工程中。官网可以下载最新版的DLL文件,下载地址。此外,也可以通过NuGet Package Manager搜索Spire.PDF for .NET然后点击安装。
示例代码
在进行签名前,需要准备以下资料:
1)数字证书和密码;
2)时间戳服务器的URL地址(本文使用的地址是http://timestamp.wosign.com/rfc3161);
using System.Drawing;
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Security;
namespace Digitally_Sign_Pdf_with_Timestamp
{
class Program
{
static void Main(string[] args)
{
//加载PDF文档
PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile("Additional.pdf");
//获取第一页
PdfPageBase page = pdf.Pages[0];
//加载数字证书(.pfx文件)
PdfCertificate cert = new PdfCertificate("test.pfx", "123");
//加载一张图片
Spire.Pdf.Graphics.PdfImage image = Spire.Pdf.Graphics.PdfImage.FromFile("Logo.jpg");
//添加跟图片一样大小的签名到第一页,并设置图片为签名图片
Spire.Pdf.Security.PdfSignature signature = new Spire.Pdf.Security.PdfSignature(page.Document, page, cert, "sign1");
signature.Bounds = new RectangleF(new PointF(100, 300), new SizeF(image.Width, image.Height));
signature.SignImageSource = image;
signature.GraphicsMode = Spire.Pdf.Security.GraphicMode.SignImageAndSignDetail;
signature.SignImageLayout = Spire.Pdf.Security.SignImageLayout.Stretch;
signature.DocumentPermissions = Spire.Pdf.Security.PdfCertificationFlags.AllowFormFill | Spire.Pdf.Security.PdfCertificationFlags.AllowComments;
//配置时间戳服务器
string url = "http://timestamp.wosign.com/rfc3161";
signature.ConfigureTimestamp(url);
//保存文档
pdf.SaveToFile("output.pdf");
}
}
}
效果: