C#和vb.net实现PDF 添加可视化和不可见数字签名

C# 和 VB.net 都可以使用 iTextSharp 库来实现 PDF 文件添加数字签名。数字签名可以是可视化的,也可以是不可见的。

以下是实现 PDF 添加数字签名的完整攻略:

步骤 1:引入 iTextSharp 库

在项目中引入 iTextSharp 库。通常会从 NuGet 软件包管理器中安装该库,或者从官方网站 https://github.com/itext/itextsharp 下载。

步骤 2:创建签名类

首先,创建一个签名类,该类继承了 IExternalSignature 接口,实现了 Sign 方法。在 Sign 方法中,我们可以使用数字证书对 PDF 签名,并将签名数据写入 PDF 文件。

public class MyExternalSignature : IExternalSignature
{
    private string _pkcs12FilePath;
    private string _password;

    public MyExternalSignature(string pkcs12FilePath, string password)
    {
        _pkcs12FilePath = pkcs12FilePath;
        _password = password;
    }

    public string GetHashAlgorithm()
    {
        return DigestAlgorithms.SHA256;
    }

    public string GetEncryptionAlgorithm()
    {
        return EncryptionAlgorithm.RSA;
    }

    public byte[] Sign(byte[] message)
    {
        X509Certificate2 pkcs12 = new X509Certificate2(_pkcs12FilePath, _password);
        RSACryptoServiceProvider key = (RSACryptoServiceProvider)pkcs12.PrivateKey;
        Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] { DotNetUtilities.FromX509Certificate(pkcs12) };
        IExternalSignature signature = new PrivateKeySignature(key, GetHashAlgorithm());
        return signature.Sign(message);
    }
}

步骤 3:创建 PDF 签名

接下来,我们需要创建 PDF 签名。以下是一个简单的方法,它接受输入文件名,数字证书和输出文件名。其中,数字证书作为参数传递给 MyExternalSignature 类的构造函数。

private void SignPdf(string inputFilePath, string certFilePath, string certPassword, string outputFilePath)
{
    var reader = new PdfReader(inputFilePath);
    var stamper = PdfStamper.CreateSignature(reader, new FileStream(outputFilePath, FileMode.Create), '\0');
    var appearance = stamper.SignatureAppearance;
    appearance.SetVisibleSignature("Signed by me");
    appearance.Reason = "Signed by me";
    appearance.Location = "Shanghai";
    var externalSignature = new MyExternalSignature(certFilePath, certPassword);
    MakeSignature.SignDetached(appearance, externalSignature, new Org.BouncyCastle.X509.X509Certificate[] { });
}

示例 1: 可视化签名

以下是一个多页 PDF 文件的示例。此示例在第一页顶部添加了可视化签名。

var inputFilePath = "input.pdf";
var outputFilePath = "output.pdf";
var certFilePath = "cert.pfx";
var certPassword = "password";

var reader = new PdfReader(inputFilePath);
var stamper = PdfStamper.CreateSignature(reader, new FileStream(outputFilePath, FileMode.Create), '\0');

var signaturePage = 1;
var pageSize = reader.GetPageSizeWithRotation(signaturePage);
var x = pageSize.Left + 10;
var y = pageSize.Top - 10;
var signatureField = PdfFormField.CreateSignature(stamper.Writer);
signatureField.FieldName = "Signature1";
signatureField.SetWidget(new iTextSharp.text.Rectangle(x, y, x + 200, y + 50), PdfAnnotation.HighlightInvert);
signatureField.SetPage(signaturePage);
signatureField.MKBorderColor = BaseColor.GRAY;
signatureField.MKBackgroundColor = BaseColor.LIGHT_GRAY;
stamper.AddAnnotation(signatureField, signaturePage);

var appearance = stamper.SignatureAppearance;
appearance.SetVisibleSignature(new Rectangle(x, y, x + 200, y + 50), signaturePage, "Signed by me");
appearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.GRAPHIC;
appearance.CertificationLevel = PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED;
appearance.Reason = "Signed by me";
appearance.Location = "Shanghai";

var externalSignature = new MyExternalSignature(certFilePath, certPassword);
MakeSignature.SignDetached(appearance, externalSignature, new Org.BouncyCastle.X509.X509Certificate[] { });
stamper.Close();

此示例首先创建了一个 signatureField 对象并将其添加到第一页的指定位置。然后,它设置了可视化签名的外观,并使用 MakeSignature.SignDetached 方法进行签名。

示例 2: 不可视化签名

以下示例使用不可视化签名签署 PDF 文件。

var inputFilePath = "input.pdf";
var outputFilePath = "output.pdf";
var certFilePath = "cert.pfx";
var certPassword = "password";

var externalSignature = new MyExternalSignature(certFilePath, certPassword);

using (Stream input = new FileStream(inputFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
using (Stream output = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
{
    var signer = new PdfSigner(new PdfReader(input), output, new StampingProperties().UseAppendMode());
    signer.SetCertificationLevel(PdfSigner.NOT_CERTIFIED);
    signer.SignExternalContainer(externalSignature, 8192);
    signer.Document.Close();
}

此示例使用 PdfSigner 类来签署文档。它设置了不可视化签名,并最终使用 externalSignature 对象来签署 PDF 文件。

希望这个攻略对您有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#和vb.net实现PDF 添加可视化和不可见数字签名 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • Windows中利用计划任务实现自动备份文件

    在Windows中,可以使用计划任务(Task Scheduler)来定期自动备份文件。计划任务是Windows自带的一种工具,可以在指定的时间自动运行程序或脚本。本文将介绍如何使用计划任务实现自动备份文件的完整攻略。 步骤一:创建备份脚本 首先,需要创建一个备份脚本,用于备份指定的文件或目录。以下是一个备份脚本的示例: #!/bin/bash # 备份源目…

    C# 2023年5月15日
    00
  • C# Remove(T):从 ICollection中移除特定对象的第一个匹配项

    当你想从C# List中删除指定对象时,Remove(T)方法就可以派上用场了。该方法将查找指定对象并将其从列表中删除。以下是使用Remove(T)方法的完整攻略: 使用Remove(T)方法的步骤 确定想要删除的对象 在List中调用Remove(T)方法,并将上一步中确定的对象作为参数传递给方法 以下是一个简单示例,展示如何使用Remove(T)方法从已…

    C# 2023年4月19日
    00
  • 快速解决owin返回json字符串多带了双引号”多了重string转义字符串

    当我们在使用OWIN框架中的Web API时,常常会将数据以JSON字符串的形式返回给客户端。但有时候,在返回的JSON字符串中会出现多余的双引号或转义字符串的情况,这通常是因为我们在序列化JSON时,忽略了JSON.Net中的一些配置。 为了解决这一问题,我们可以采取以下几个步骤: 确认配置 首先,我们需要确认我们的JSON.NET配置是否正确。确保配置中…

    C# 2023年5月31日
    00
  • asp.net core项目授权流程详解

    以下是“ASP.NET Core项目授权流程详解”的完整攻略: 什么是ASP.NET Core授权 ASP.NET Core授权是一种机制,用于限制用户对应用程序中的资源的访问。它允许您定义哪些用户访问哪些资源,并在用户尝试访问受保护的资源时执行必要的验证。 ASP.NET Core授权流程 ASP.NET Core授权流程包括以下步骤: 用户尝试访问受保护…

    C# 2023年5月12日
    00
  • ASP.NET输出PNG图片时出现GDI+一般性错误的解决方法

    ASP.NET输出PNG图片时出现GDI+一般性错误,通常表示出现了一些问题导致服务器无法正常处理图像。以下是解决该问题的完整攻略: 1. 了解GDI+错误 首先,我们需要了解GDI+错误是什么,以及为什么会出现。GDI+是Windows平台下的一种图像库,ASP.NET使用GDI+来生成和处理图像。当出现GDI+错误时,通常会伴随着一些错误消息,如“一般性…

    C# 2023年6月6日
    00
  • C#控制台实现飞行棋小游戏

    C#控制台实现飞行棋小游戏 介绍 飞行棋是一种流行的棋类游戏,玩家需要通过掷骰子移动棋子,在棋盘上躲避陷阱和敌人,最终到达终点。 本攻略将介绍如何使用C#编写控制台程序实现飞行棋小游戏。 实现思路 根据游戏规则,创建棋盘和棋子对象。 在控制台中显示棋盘和棋子。 等待用户输入掷骰子的结果。 根据掷骰子的结果,更新棋子位置并在控制台中重新绘制。 如果棋子到达终点…

    C# 2023年6月6日
    00
  • 详解C#中的string与String

    详解C#中的string与String 在C#中,string是一个关键字,也是一个引用类型,用于表示文本字符串。而String则是string类型的别名,它们其实是同一种类型,只是在命名规范上不同。本文将详细讲解string和String类型的定义、使用、比较和转换。 定义和使用 定义string类型的变量,可以直接使用关键字string: string …

    C# 2023年5月31日
    00
  • asp.net Execl的添加,更新操作实现代码

    接下来我会详细讲解如何在ASP.NET中进行Excel的添加和更新操作。 准备工作 在进行Excel操作之前,我们需要安装EPPlus包,它是一个免费的开源库,可以让我们在ASP.NET中轻松地操作Excel文件。在Visual Studio中,可以通过NuGet包管理器安装EPPlus。 添加Excel文件 要向Excel文件中添加数据,我们需要使用EPP…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部