C#实现PDF签名时添加时间戳的2种方法(附VB.NET代码)

在PDF添加签名时,支持添加可信时间戳来保证文档的法律效应。本文,将通过C#程序代码介绍如何添加可信时间戳,可通过2种方法来实现。文中附上VB.NET代码,有需可供参考。

一、程序运行环境

  • 编译环境:Visual Studio/.NetFramework 4.8
  • 所需测试文件:PDF、.pfx数字证书及秘钥、PDF类库(spire.pdf.dll 7.5.7)
  • 可信时间戳服务器:URL地址

注:VS程序中,在“解决方案资源管理器中”先引用spire.pdf.dll文件,如下图,

这里可以通过Nuget下载该文件。或者在手动下载引用,dll文件在下载后的文件包BIN文件夹下,如本次测试使用的是.NET4.0下面的dll,即spire.pdf_7.5.7\BIN\NET4.0\Spire.Pdf.dll,如图:

二、程序代码

添加签名时,这里可分别通过两个类来实现,即PdfSignature 和 PdfOrdinarySignatureMaker类。下面分别以两个代码示例展示如何签名并添加时间戳。

1. 通过PdfSignature类来签名,添加时间戳

C#

using Spire.Pdf;
using Spire.Pdf.Security;
using System.Drawing;

namespace TimeStamp
{
    class Program
    {
        static void Main(string[] args)
        {
            //加载PDF文档
            PdfDocument pdf = new PdfDocument();
            pdf.LoadFromFile("sample.pdf");

            //获取第2页
            PdfPageBase page = pdf.Pages[1];

            //加载数字证书(.pfx文件及秘钥)
            PdfCertificate cert = new PdfCertificate("test.pfx", "123456");

            //加载签名图片
            Spire.Pdf.Graphics.PdfImage image = Spire.Pdf.Graphics.PdfImage.FromFile("sign.png");

            //添加与图片大小相同的签名到第2页指定坐标位置
            PdfSignature signature = new PdfSignature(page.Document, page, cert, "sign1");//添加数字签名
            signature.Bounds = new RectangleF(new PointF(400,700), 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 = "Your TimeStamp Server URL";
            signature.ConfigureTimestamp(url);
            //signature.ConfigureTimestamp(url, "Author", "123654");//添加时间戳时设置用户名和密码

            //保存文档
            pdf.SaveToFile("TimeStamp1.pdf",FileFormat.PDF);
            System.Diagnostics.Process.Start("TimeStamp1.pdf");
        }
    }
}

VB.NET

Imports Spire.Pdf
Imports Spire.Pdf.Security
Imports System.Drawing

Namespace TimeStamp
    Class Program
        Private Shared Sub Main(args As String())
            '加载PDF文档
            Dim pdf As New PdfDocument()
            pdf.LoadFromFile("sample.pdf")

            '获取第2页
            Dim page As PdfPageBase = pdf.Pages(1)

            '加载数字证书(.pfx文件及秘钥)
            Dim cert As New PdfCertificate("test.pfx", "123456")

            '加载签名图片
            Dim image As Spire.Pdf.Graphics.PdfImage = Spire.Pdf.Graphics.PdfImage.FromFile("sign.png")

            '添加与图片大小相同的签名到第2页指定坐标位置
            Dim signature As New PdfSignature(page.Document, page, cert, "sign1")

            '添加数字签名
            signature.Bounds = New RectangleF(New PointF(400, 700), 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 Or Spire.Pdf.Security.PdfCertificationFlags.AllowComments'文档权限           

            '配置时间戳服务器,添加时间戳
            Dim url As String = "Your TimeStamp Server URL"
            signature.ConfigureTimestamp(url)
            'signature.ConfigureTimestamp(url, "Author", "123654");//添加时间戳时设置用户名和密码

            '保存文档
            pdf.SaveToFile("TimeStamp1.pdf", FileFormat.PDF)
            System.Diagnostics.Process.Start("TimeStamp1.pdf")
        End Sub
    End Class
End Namespace

签名时间戳添加结果:

2. 通过PdfOrdinarySignatureMaker类来签名,添加时间戳

C#

using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Interactive.DigitalSignatures;
using System.Drawing;
using System.Security.Cryptography.X509Certificates;

namespace TimeStamp2
{
    class Program
    {
        static void Main(string[] args)
        {
            //加载PDF文档
            PdfDocument doc = new PdfDocument();
            doc.LoadFromFile("sample.pdf");

            //加载pfx数字证书及秘钥
            X509Certificate2 x509 = new X509Certificate2("test.pfx", "123456");

            //实例化PdfPKCS7Formatter类的对象
            PdfPKCS7Formatter formatter = new PdfPKCS7Formatter(x509, false);
            formatter.TimestampService = new TSAHttpService("Your TimeStamp Server URL");//配置时间戳服务器

            //添加签名
            PdfOrdinarySignatureMaker signatureMaker = new PdfOrdinarySignatureMaker(doc, formatter);
            IPdfSignatureAppearance signatureAppearance = new PdfCustomSignatureAppearance();
            signatureMaker.MakeSignature("sign", doc.Pages[1], 400, 650, 150, 80, signatureAppearance);

            //保存签名后的PDF文档
            doc.SaveToFile("TimeStamp2.pdf", FileFormat.PDF);
            System.Diagnostics.Process.Start("TimeStamp2.pdf");

        }
        public class PdfCustomSignatureAppearance : IPdfSignatureAppearance
        {
            public void Generate(PdfCanvas canvas)
            {
                PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Arial", 12), true);
                canvas.DrawString("SIGNED! A CLASS.\n By Tom Smith", font, PdfBrushes.Red, new PointF(0, 0));
            }
        }
    }
}

VB.NET

Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports Spire.Pdf.Interactive.DigitalSignatures
Imports System.Drawing
Imports System.Security.Cryptography.X509Certificates

Namespace TimeStamp2
    Class Program
        Private Shared Sub Main(args As String())
            '加载PDF文档
            Dim doc As New PdfDocument()
            doc.LoadFromFile("sample.pdf")

            '加载pfx数字证书及秘钥
            Dim x509 As New X509Certificate2("test.pfx", "123456")

            '实例化PdfPKCS7Formatter类的对象
            Dim formatter As New PdfPKCS7Formatter(x509, False)
            formatter.TimestampService = New TSAHttpService("Your TimeStamp Server URL")
            '配置时间戳服务器

'添加签名
            Dim signatureMaker As New PdfOrdinarySignatureMaker(doc, formatter)
            Dim signatureAppearance As IPdfSignatureAppearance = New PdfCustomSignatureAppearance()
            signatureMaker.MakeSignature("sign", doc.Pages(1), 400, 650, 150, 80, _
                signatureAppearance)

            '保存签名后的PDF文档
            doc.SaveToFile("TimeStamp2.pdf", FileFormat.PDF)
            System.Diagnostics.Process.Start("TimeStamp2.pdf")

        End Sub
        Public Class PdfCustomSignatureAppearance
            Implements IPdfSignatureAppearance
            Public Sub Generate(canvas As PdfCanvas)
                Dim font As New PdfTrueTypeFont(New Font("Arial", 12), True)
                canvas.DrawString("SIGNED! A CLASS." & vbLf & " By Tom Smith", font, PdfBrushes.Red, New PointF(0, 0))
            End Sub
        End Class
    End Class
End Namespace

签名时间戳添加结果:

到此这篇关于C#实现PDF签名时添加时间戳的2种方法(附VB.NET代码)的文章就介绍到这了,更多相关C# PDF签名添加时间戳 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C# DateTime与时间戳转换实例

    C# DateTime与时间戳的相互转换,包括JavaScript时间戳和Unix的时间戳. 1. 什么是时间戳 首先要清楚JavaScript与Unix的时间戳的区别: JavaScript时间戳:是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数. Unix时间戳:是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数. 可以看出JavaScrip

  • C#实现时间戳的简单方法

    Introduction: 在项目开发中,我们都经常会用到时间戳来进行时间的存储和传递,最常用的Unix时间戳(TimeStamp)是指格林尼治时间1970年1月1日0时(北京时间1970年1月1日8时)起至现在的总秒数(10位)或总毫秒数(13位): Body: 而在C#中.Net框架没有提供现成的获取时间戳的方式,这里分享一个自己实现的时间戳转换工具: /// <summary> /// 时间工具类 /// </summary> public static class Date

  • C#中系统时间和UNIX时间戳互相转换

    在项目开发过程中,有时会遇到不同程序之间相互调用数据,数据中不免会包含时间,比如ASP.NET调用PHP,牵扯到时间就要做一下处理,PHP程序中一般存取的都是UNIX时间,不像ASP.NET存储的是年月日时分秒,这样就需要做一下转换,代码如下: 一.将系统时间转换成UNIX时间戳 复制代码 代码如下: DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970,1,1)); DateTime dtNow =

  • js时间戳和c#时间戳互转方法(推荐)

    实例如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using Newtonsoft.Json; namespace TestWeb { public partial class ajax : System.Web.UI.Page { protected voi

  • C# 时间与时间戳互转的方法(13位)

    目前经常出现的时间有三个: 本地时间(locale time) 格林威治时间(Greenwich Mean Time GMT) 时间协调时间 (Universal Time Coordinated UTC) 时间标准: (1)世界时 世界时是最早的时间标准.在1884年,国际上将1s确定为全年内每日平均长度的1/8.64×104.以此标准形成的时间系统,称为世界时(UT1). 1972年国际上开始使用国际原子时标,从那以后,经过格林威治老天文台本初子午线的时间便被称为世界时(UT2),或称格林威

  • C#时间戳基本用法实例分析

    本文实例讲述了C#时间戳基本用法.分享给大家供大家参考.具体如下: 一.C#如何生成一个时间戳 /// <summary> /// 获取时间戳 /// </summary> /// <returns></returns> public static string GetTimeStamp() { TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); return Conve

  • C#时间格式转换为时间戳的方法步骤

    时间戳转换: /// <summary> /// C#时间格式转换为时间戳(互转) /// 时间戳定义为从格林威治时间 1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数. /// </summary> public class DateTime_TimeStamp : MonoBehaviour { protected int m_timestamp; /// <summary> /// 获取时间戳Timest

  • C#实现PDF签名时添加时间戳的2种方法(附VB.NET代码)

    在PDF添加签名时,支持添加可信时间戳来保证文档的法律效应.本文,将通过C#程序代码介绍如何添加可信时间戳,可通过2种方法来实现.文中附上VB.NET代码,有需可供参考. 一.程序运行环境 编译环境:Visual Studio/.NetFramework 4.8 所需测试文件:PDF..pfx数字证书及秘钥.PDF类库(spire.pdf.dll 7.5.7) 可信时间戳服务器:URL地址 注:VS程序中,在"解决方案资源管理器中"先引用spire.pdf.dll文件,如下图, 这里可

  • Java 给PDF签名时添加可信时间戳的方法

    一.程序运行环境 编译环境:IntelliJ IDEA 所需测试文件:PDF..pfx数字证书及密钥.PDF Jar包(Free Spire.PDF for Java).签名图片(.png格式) 可信时间戳服务器:URL地址 注:以下代码中的所有测试文件路径均为IDEA程序项目文件夹路径,如C:\Users\Administrator\IdeaProjects\Certificate_PDF\test.pdf,文件路径可自定义. 关于jar导入可参考如下2种方法: 1.手动导入:下载jar包到本

  • MySQL表中添加时间戳的几种方法

    场景: 有张表的数据需要用同步工具同步至其他库,需要 update_time 时间戳字段 来做增量同步. 解决方法: alter table quant_stk_calc_d_wxcp add update_time timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.

  • Java 在PDF中添加条形码的两种方法

    条形码,是由宽度不等的多个黑条和空白所组成,用以表达一组信息的图形标识符.通过给文档添加条形码,可以直观,快捷地访问和分享一些重要的信息.本文就将通过使用Java程序来演示如何在PDF文档中添加Codebar.Code128A和Code39条形码.除此之外,还可支持创建Code11.Code128B.Code32.Code39 Extended .Code93和Code93 Extended条形码. 使用工具:Free Spire.PDF for Java(免费版) Jar文件获取及导入: 方法

  • Python获取网络时间戳的两种方法详解

    目录 方法一 代码实现 调用方法 返回结果 方法二 代码实现 调用方法 返回结果 在我们进行注册码的有效期验证时,通常使用获取网络时间的方式来进行比对. 以下为获取网络时间的几种方式. 方法一 需要的时间会比较长,个别电脑上可能会出现不兼容现象 代码实现 def get_web_server_time(self, host_URL, year_str='-', time_str=':'): ''' 获取网络时间,需要的时间会比较长,个别电脑上可能会出现不兼容现象 :param host_URL:

  • Python在图片中添加文字的两种方法

    本文主要介绍的是利用Python在图片中添加文字的两种方法,下面分享处理供大家参考学习,下来要看看吧 一.使用OpenCV 在图片中添加文字看上去很简单,但是如果是利用OpenCV来做却很麻烦.OpenCV中并没有使用自定义字体文件的函数,这不仅意味着我们不能使用自己的字体,而且意味着他无法显示中文字符.这还是非常要命的事情.而且他显示出来的文字位置也不太好控制.比如下面的代码,他想做的仅仅是显示数字3: 代码: #coding=utf-8 import cv2 import numpy as

  • java 在file的尾部添加数据的两种方法总结

    java 在file的尾部添加数据的两种方法总结 问题描述:   在文件的末尾追加内容 方法1:利用RandomAccessFile类  1.将randomAccessFile模式设置为rw  2将randomAccessFile移动(seek)到文件末尾  3追加数据  4关闭流 方法2:利用FileWriter类  1.将FileWriter构造方法第二个参数置为true.表示在尾部追加  2追加数据  3.关闭流 实现代码: package cn.com; import java.io.F

  • 基于Android在布局中动态添加view的两种方法(总结)

    一.说明 添加视图文件的时候有两种方式:1.通过在xml文件定义layout:2.java代码编写 二.前言说明 1.构造xml文件 2.LayoutInflater 提到addview,首先要了解一下LayoutInflater类.这个类最主要的功能就是实现将xml表述的layout转化为View的功能.为了便于理解,我们可以将它与findViewById()作一比较,二者都是实例化某一对象,不同的是findViewById()是找xml布局文件下的具体widget控件实例化,而LayoutI

  • JS Input里添加小图标的两种方法

    我们在做网页的时候,经常需要在input里面添加小图标,那么这里就介绍比较常见的两种方法. 方法一 将小图标当做input的背景来插入,直接上代码吧: <style type="text/css"> *{ margin: 0; padding: 0; } input{ border: none; } .box{ height: 50px; background: yellow; } .box input{ width: 200px; height: 30px; border

  • c# 向MySQL添加数据的两种方法

    下面介绍两种执行SQL命令的方法,并作出相应地总结,第一种介绍一种常规用法,下面进行做简要地分析,首先我们需要执行打开数据库操作首先创建一个MySqlConnection对象,在其构造函数中传入一个连接字符串,然后执行Open操作打开数据库,在正确打开数据库之后我们才能进行相关的动作,在ExecuteSQL这个函数中, 我们执行MySqlCommand myCmd = new MySqlCommand(CmdString, conn),从而创建MySqlCommand对象,其中传入的两个参数分别

随机推荐