产品比较

使用 Itextsharp 添加数字签名到 PDF 在 C# 中

发布 2023年四月18日
分享:

签署 PDF 文档,包括 PDF 文件。 数字签名是指一种数学公式,用于验证和确保电子文档的完整性。

在本教程中,我们将向您展示 如何在 PDF 中添加数字签名信息 在 C# 中使用 iTextSharp 和 IronPDF 库。

在深入了解代码之前,让我们先快速了解一下什么是数字签名以及数字签名的重要性。

什么是数字签名?

数字签名是指一种数学公式,用于验证和确保电子文档的完整性。

它是一种电子签名,用于对电子文档进行数字签名。 数字签名具有很高的安全性,在许多国家都具有法律约束力。

在对文件进行数字签名时,会创建一个与文件相关联的唯一数字签名。

该签名使用私人密钥创建,而私人密钥只有签名者知道。 签名密钥包含签名者的信息,包括姓名、电子邮件地址和其他详细信息。

要验证数字签名文件的真实性,收件人必须能够获取签名者的公开密钥。 公钥用于解密签名并验证其真实性。

数字签名为何重要?

数字签名非常重要,因为它能提供高度的安全性,确保数字文档的完整性。

它们通常用于需要签署文件的场合,如合同、协议和其他法律文件。

与传统签名相比,数字签名具有多种优势:

  1. 与传统签名相比,它们更安全、更防篡改。
  2. 它们可以通过电子方式进行验证,从而减少了人工验证的需要。
  3. 它们可用于在世界任何地方签署文件。
  4. 与传统签名相比,它们能提供更高水平的保证。

比较如何使用 itextsharp 和 IronPDF 库在 C# 中为 pdf 文档添加数字签名

既然我们已经了解了什么是数字签名以及数字签名的重要性,下面就让我们看看如何使用 iTextSharp 和 IronPDF 在 C# 中为 PDF 文档添加数字签名。

数字签名用于验证电子文档的真实性,而 PDF 是此类文档的常用数据格式。

在本教程中,我们将比较如何使用 iTextSharp 和 IronPDF 这两个 C# 库为 PDF 文件添加数字签名。

电子签名:使用真实签名进行数字签名的未来

iTextSharp 是一个流行的开源库,用于用 C# 创建和操作 PDF 文档。

它包括对数字签名的支持,在 .NET 项目中被广泛使用。 另一方面,IronPDF 是一个商业库,提供类似的 PDF 操作功能,包括数字签名。

在本教程中,我们将演示如何使用这两个库为 PDF 文档添加数字签名,包括创建数字证书、使用私钥签署 PDF 文档和验证签名等概念。 我们还将提供每个步骤的源代码示例。

先决条件

在开始之前,您应该对 C# 编程和 .NET Framework 有基本的了解。

此外,您还需要在项目中安装 iTextSharp 和 IronPDF 库。

您可以从 NuGet 下载 iTextSharp,也可以从 IronPDF 网站下载 IronPDF。

以编程方式添加 PDF 数字签名

创建数字证书

IronPDF for .NET 是一个.NET 库,可让您用 C# 创建、编辑和签署 PDF 文档。 在本指南中,我们将介绍使用 IronPDF 和 X509Certificate2 对象签署 PDF 的过程。

查看签名人详情

以下是使用 IronPDF 签署 PDF 的步骤:

  1. 包括必要的命名空间。
    using IronPdf; using IronPdf.Signing; using System.Security.Cryptography.X509Certificates;  
    using IronPdf; using IronPdf.Signing; using System.Security.Cryptography.X509Certificates;  
Imports IronPdf
Imports IronPdf.Signing
Imports System.Security.Cryptography.X509Certificates
VB   C#
  1. 使用 "ChromePdfRenderer "类渲染 PDF 文档。
    ChromePdfRenderer renderer = new ChromePdfRenderer();
    PdfDocument pdf = renderer.RenderHtmlAsPdf("foo");  
    ChromePdfRenderer renderer = new ChromePdfRenderer();
    PdfDocument pdf = renderer.RenderHtmlAsPdf("foo");  
Dim renderer As New ChromePdfRenderer()
	Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("foo")
VB   C#

在本例中,我们将呈现一个简单的 HTML 文档,其中只有一个标题元素。

![](/static-assets/pdf/blog/add-digital-signature-topdf-in-csharp-using-itextsharp/add-digital-signature-topdf-in-csharp-using-itextsharp-6.webp)
  1. 加载 X509Certificate2 对象,其中包含用于签署 PDF 的数字签名。
    X509Certificate2 cert = new X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable);  
    X509Certificate2 cert = new X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable);  
Dim cert As New X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable)
VB   C#

在本例中,我们从名为 "IronSoftware.pfx "的 PKCS#12 文件中加载证书,并提供密码 "123456"。 我们还将 X509KeyStorageFlags 设置为 Exportable,以便使用证书的私钥来签署 PDF。

![](/static-assets/pdf/blog/add-digital-signature-topdf-in-csharp-using-itextsharp/add-digital-signature-topdf-in-csharp-using-itextsharp-7.webp) 
  1. 使用证书创建 PdfSignature 对象。
    var sig = new PdfSignature(cert);  
    var sig = new PdfSignature(cert);  
Dim sig = New PdfSignature(cert)
VB   C#

在本例中,我们使用步骤 3 中创建的证书对象创建一个新的 PdfSignature 对象。

  1. 使用 "PdfDocument.Sign "签署 PDF 文档()方法,传入在步骤 4 中创建的 PdfSignature 对象。
  pdf.Sign(sig);  
  pdf.Sign(sig);  
pdf.Sign(sig)
VB   C#
  1. 将已签名的 PDF 文档保存到文件中。
    pdf.SaveAs("signed.pdf");  
    pdf.SaveAs("signed.pdf");  
pdf.SaveAs("signed.pdf")
VB   C#

下面是完整的代码:

using IronPdf; 
using IronPdf.Signing; 
using System.Security.Cryptography.X509Certificates;
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("foo");
X509Certificate2 cert = new X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable);
var sig = new PdfSignature(cert);
pdf.Sign(sig);
pdf.SaveAs("signed.pdf");  
using IronPdf; 
using IronPdf.Signing; 
using System.Security.Cryptography.X509Certificates;
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("foo");
X509Certificate2 cert = new X509Certificate2("IronSoftware.pfx", "123456", X509KeyStorageFlags.Exportable);
var sig = new PdfSignature(cert);
pdf.Sign(sig);
pdf.SaveAs("signed.pdf");  
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

IronPDF - 在 Software.com.br 上阅读

签署 PDF 文件

创建数字证书后,我们就可以用它来签署 PDF 文件了。

要在 PDF 文件上签名,我们需要创建一个新的签名对象并设置其属性,例如新签名在页面上的位置和签名的原因。

要使用 iTextSharp 签署 PDF 文件,我们可以使用以下代码

iTextSharp 是一个流行的开源库,用于在 C# 中处理 PDF 文档。 有了 iTextSharp,你就可以创建和处理 PDF 文档,并为其添加数字签名。 在本文中,我们将重点介绍如何使用 iTextSharp 签署 PDF 文件。

要开始使用,您需要在项目中添加对 iTextSharp.dll 文件的引用。 你可以从其官方网站下载 iTextSharp 的最新版本。

在项目中添加 iTextSharp 引用后,就可以使用 PDFSigner 库来签署 PDF 文档。 PDFSigner 库包含三个类:"Cert"、"MetaData "和 "PDFSigner"。

Cert 类用于保存证书并提取签名所需的信息。 MetaData "类保存 PDF 元数据,"PDFSigner "类用于创建签名并将其添加到 PDF 文档中。

processCert "方法用于读取数字证书并提取私钥条目。 如果有数字证书链,它还会构建数字证书链。

签名 "方法用于使用 PDFStamper 创建新的 PDF 文档并添加签名。 您可以配置签名的外观,并为其添加原因、联系人和位置属性。 SetCrypto方法用于使用从证书文件中提取的私钥和链证书对文档进行签名。最后,如果需要在文档中添加可见签名,可使用SetVisibleSignature` 方法。

下面是一个示例代码片段,展示了如何使用 iTextSharp 签署 PDF 文件:

using iTextSharp.text.pdf;
using System.IO; 
public void SignPDF(string inputPDF, string outputPDF, string certPath, string certPassword, string reason, string contact, string location, bool visible) { 
  PdfReader reader = new PdfReader(inputPDF);
  //Activate MultiSignatures
  PdfStamper st = PdfStamper.CreateSignature(reader, new FileStream(outputPDF, FileMode.Create, FileAccess.Write), '\0', null, true); 
  //To disable Multi signatures uncomment this line: 
  //every new signature will invalidate older ones! 
  //PdfStamper st = PdfStamper.CreateSignature(reader, new FileStream(outputPDF, FileMode.Create, FileAccess.Write), '\0'); 
  MetaData metadata = new MetaData();
  metadata.setAuthor("John Doe"); 
  metadata.setTitle("Signed PDF Document");
  st.MoreInfo = metadata.getMetaData();
  st.XmpMetadata = metadata.getStreamedMetaData();
  PdfSignatureAppearance sap = st.SignatureAppearance;
  //Read the certificate and extract the private key entry
  Cert myCert = new Cert(certPath, certPassword);
  sap.SetCrypto(myCert.Akp, myCert.Chain, null, PdfSignatureAppearance.WINCER_SIGNED);
  sap.Reason = reason;
  sap.Contact = contact;
  sap.Location = location; 
  //Add a visible signature to the document if (visible)
  sap.SetVisibleSignature(new iTextSharp.text.Rectangle(100, 100, 250, 150), 1, null);
  st.Close();
}  
using iTextSharp.text.pdf;
using System.IO; 
public void SignPDF(string inputPDF, string outputPDF, string certPath, string certPassword, string reason, string contact, string location, bool visible) { 
  PdfReader reader = new PdfReader(inputPDF);
  //Activate MultiSignatures
  PdfStamper st = PdfStamper.CreateSignature(reader, new FileStream(outputPDF, FileMode.Create, FileAccess.Write), '\0', null, true); 
  //To disable Multi signatures uncomment this line: 
  //every new signature will invalidate older ones! 
  //PdfStamper st = PdfStamper.CreateSignature(reader, new FileStream(outputPDF, FileMode.Create, FileAccess.Write), '\0'); 
  MetaData metadata = new MetaData();
  metadata.setAuthor("John Doe"); 
  metadata.setTitle("Signed PDF Document");
  st.MoreInfo = metadata.getMetaData();
  st.XmpMetadata = metadata.getStreamedMetaData();
  PdfSignatureAppearance sap = st.SignatureAppearance;
  //Read the certificate and extract the private key entry
  Cert myCert = new Cert(certPath, certPassword);
  sap.SetCrypto(myCert.Akp, myCert.Chain, null, PdfSignatureAppearance.WINCER_SIGNED);
  sap.Reason = reason;
  sap.Contact = contact;
  sap.Location = location; 
  //Add a visible signature to the document if (visible)
  sap.SetVisibleSignature(new iTextSharp.text.Rectangle(100, 100, 250, 150), 1, null);
  st.Close();
}  
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

要使用 IronPDF 签署 PDF 文件,我们可以使用以下代码

要签署 PDF 文件,请按照以下步骤操作:

  1. 包括必要的命名空间:
    using IronPdf;  
    using IronPdf;  
Imports IronPdf
VB   C#
  1. 使用 PdfDocument.FromFile 加载 PDF 文件() 方法:
    PdfDocument pdf = PdfDocument.FromFile("annual_census.pdf");  
    PdfDocument pdf = PdfDocument.FromFile("annual_census.pdf");  
Dim pdf As PdfDocument = PdfDocument.FromFile("annual_census.pdf")
VB   C#

在本例中,我们从当前目录加载名为 "annual_census.pdf "的 PDF 文件。 此方法返回一个 PdfDocument 对象,表示加载的 PDF 文件。

  1. 对 PDF 文件进行必要的编辑。

     在本例中,我们假定对 PDF 文件进行了一些编辑。
  2. 使用 PdfDocument.SignWithFile 签署 PDF 文件() 方法:
    pdf.SignWithFile("/assets/IronSignature.p12", "password", null, PdfDocument.SignaturePermissions.FormFillingAllowed);  
    pdf.SignWithFile("/assets/IronSignature.p12", "password", null, PdfDocument.SignaturePermissions.FormFillingAllowed);  
pdf.SignWithFile("/assets/IronSignature.p12", "password", Nothing, PdfDocument.SignaturePermissions.FormFillingAllowed)
VB   C#

在本例中,我们使用位于"/assets "目录下的名为 "IronSignature.p12 "的 PKCS#12 文件对 PDF 文件进行签名。 我们还提供了 PKCS#12 文件的密码作为第二个参数。 第三个参数指定签署 PDF 文件的原因,我们将其留空。 第四个参数指定签名权限,我们将其设置为只允许填写表格。

  1. 使用 PdfDocument.SaveAsRevision 将带有签名的 PDF 文件保存为修订版() 方法:
    PdfDocument pdfWithRevision = pdf.SaveAsRevision();  
    PdfDocument pdfWithRevision = pdf.SaveAsRevision();  
Dim pdfWithRevision As PdfDocument = pdf.SaveAsRevision()
VB   C#

该方法创建一个新的 PdfDocument 对象,其中包含原始 PDF 文件和作为修订版的签名。

  1. 使用 PdfDocument.SaveAs 将已签名的 PDF 文件保存到磁盘中() 方法:
    pdfWithRevision.SaveAs("annual\_census\_2.pdf");  
    pdfWithRevision.SaveAs("annual\_census\_2.pdf");  
pdfWithRevision.SaveAs("annual\_census\_2.pdf")
VB   C#

在本例中,我们将已签名 PDF 文件的文件名保存为当前目录下的 "ann annual/_census/_2.pdf"。

    以下是完整的代码:
    using IronPdf; PdfDocument pdf = PdfDocument.FromFile("annual\_census.pdf"); 
    // make any necessary edits 
    pdf.SignWithFile("/assets/IronSignature.p12", "password", null, PdfDocument.SignaturePermissions.FormFillingAllowed); 
    PdfDocument pdfWithRevision = pdf.SaveAsRevision(); 
    pdfWithRevision.SaveAs("annual\_census_2.pdf");  
    using IronPdf; PdfDocument pdf = PdfDocument.FromFile("annual\_census.pdf"); 
    // make any necessary edits 
    pdf.SignWithFile("/assets/IronSignature.p12", "password", null, PdfDocument.SignaturePermissions.FormFillingAllowed); 
    PdfDocument pdfWithRevision = pdf.SaveAsRevision(); 
    pdfWithRevision.SaveAs("annual\_census_2.pdf");  
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

IronPDF for .NET

验证数字签名

PDF 文档签名后,必须能够验证签名,以确保文档在签名后未被篡改。

使用 iTextSharp 库验证数字签名

要使用 C# 中的 iTextSharp 验证 PDF 数字签名,请按以下步骤操作:

  1. 首先,将 iTextSharp 库添加到项目中。 您可以使用 Visual Studio 中的 NuGet 软件包管理器来完成此操作。 搜索 iTextSharp 并安装。
  2. 使用 iTextSharp 库定义验证 PDF 文档数字签名的函数。
  3. 在该函数中,通过传递要验证的 PDF 文档的路径,创建一个 PdfReader 对象。
  4. 接下来,使用 PdfReader 对象的 GetAcroFields 方法获取 PDF 文档的 AcroFields。
  5. 使用 AcroFields 对象的 GetSignatureNames 方法获取签名名称。
  6. 遍历签名名称,并使用 "AcroFields "对象的 "GetSignature "方法检索每个签名的 "PdfPKCS7 "对象。
  7. 使用 PdfPKCS7 对象的 Verify 方法验证签名。
  8. 如果签名有效,则返回 true。 否则,返回 false。

    下面是在 C# 中使用 iTextSharp 验证 PDF 文档数字签名的代码:

public static bool VerifyPdfDigitalSignature(string filePath)
{
    bool isValid = false;
    try
    {
        // Create a PdfReader object
        PdfReader reader = new PdfReader(filePath);
        // Get the AcroFields of the PDF document
        AcroFields fields = reader.AcroFields;
        // Get the signature names
        List<string> names = fields.GetSignatureNames();
        // Iterate through the signature names
        foreach (string name in names)
        {
            // Get the PdfPKCS7 object for the signature
            PdfPKCS7 pkcs7 = fields.VerifySignature(name);
            // Verify the signature
            if (pkcs7.Verify())
            {
                isValid = true;
            }
            else
            {
                isValid = false;
            }
        }
        reader.Close();
    }
    catch (Exception ex)
    {
        // Handle exception
        isValid = false;
    }
    return isValid;
}
public static bool VerifyPdfDigitalSignature(string filePath)
{
    bool isValid = false;
    try
    {
        // Create a PdfReader object
        PdfReader reader = new PdfReader(filePath);
        // Get the AcroFields of the PDF document
        AcroFields fields = reader.AcroFields;
        // Get the signature names
        List<string> names = fields.GetSignatureNames();
        // Iterate through the signature names
        foreach (string name in names)
        {
            // Get the PdfPKCS7 object for the signature
            PdfPKCS7 pkcs7 = fields.VerifySignature(name);
            // Verify the signature
            if (pkcs7.Verify())
            {
                isValid = true;
            }
            else
            {
                isValid = false;
            }
        }
        reader.Close();
    }
    catch (Exception ex)
    {
        // Handle exception
        isValid = false;
    }
    return isValid;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

在上述代码中,"VerifyPdfDigitalSignature "函数将 PDF 文档的路径作为参数,并返回一个布尔值,表示数字签名是否有效。

请注意,该功能会验证 PDF 文档中的所有签名。 如果只想验证特定签名,可以将签名名称作为参数传递给 VerifySignature 方法。

使用 IronPDF 库验证数字签名

如果您的 PDF 文档包含一个或多个数字签名,您可以使用 IronPDF 验证签名,确保文档未被篡改。 下面介绍如何使用 IronPDF 的 "VerifyPdfSignatures "方法来实现这一点:

  1. 加载 PDF 文档 首先,需要使用 IronPDF 的 PdfDocument.FromFile 方法加载 PDF 文档。 该方法将文件路径作为参数,并返回一个表示 PDF 文档的 PdfDocument 对象。
    PdfDocument pdf = PdfDocument.FromFile("annual_census.pdf");  
    PdfDocument pdf = PdfDocument.FromFile("annual_census.pdf");  
Dim pdf As PdfDocument = PdfDocument.FromFile("annual_census.pdf")
VB   C#
  1. 验证签名 一旦获得了 PdfDocument 对象,就可以调用 VerifyPdfSignatures 方法来验证文档中的所有签名。 该方法返回一个布尔值,表示所有签名是否有效。
    bool isValid = pdf.VerifyPdfSignatures();  
    bool isValid = pdf.VerifyPdfSignatures();  
Dim isValid As Boolean = pdf.VerifyPdfSignatures()
VB   C#
  1. 处理结果 VerifyPdfSignatures 方法返回一个布尔值,表示文档中的所有签名是否有效。 如果值为 true,则表示所有签名都有效,文件未被篡改。 如果该值为 false,则表示一个或多个签名无效,文件可能被篡改。

    您可以利用这些信息采取适当的措施,例如向用户显示一条信息或阻止进一步处理文档。

    下面是完整的代码片段,展示了如何使用 IronPDF 验证 PDF 文档中的所有签名:

using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("annual_census.pdf");
bool isValid = pdf.VerifyPdfSignatures();
if (isValid)
{
    Console.WriteLine("All signatures are valid");
}
else
{
    Console.WriteLine("One or more signatures are invalid");
}
using IronPdf;
PdfDocument pdf = PdfDocument.FromFile("annual_census.pdf");
bool isValid = pdf.VerifyPdfSignatures();
if (isValid)
{
    Console.WriteLine("All signatures are valid");
}
else
{
    Console.WriteLine("One or more signatures are invalid");
}
Imports IronPdf
Private pdf As PdfDocument = PdfDocument.FromFile("annual_census.pdf")
Private isValid As Boolean = pdf.VerifyPdfSignatures()
If isValid Then
	Console.WriteLine("All signatures are valid")
Else
	Console.WriteLine("One or more signatures are invalid")
End If
VB   C#

许可和定价

iTextSharp 和 IronPDF 库有不同的许可证和定价模式,这可能是您在项目中选择它们时需要考虑的因素。

iTextSharp 采用 Affero 通用公共许可证许可。 (AGPL)该许可证要求任何使用 iTextSharp 的软件也必须遵循 AGPL 许可证。

不过,iTextSharp 也有商业许可,允许开发人员在专有软件中使用该库,而无需发布源代码。

iTextSharp 商业许可证的定价根据开发人员和部署实例的数量而有所不同。

另一方面,IronPDF 是一个商业库,需要付费许可才能使用。 IronPDF 的定价基于开发人员和部署实例的数量,与 iTextSharp 类似。

不过,IronPDF 还为用户提供了一个 免费试用版 功能有限,可用于非商业项目。

定价对于小型项目或预算有限的项目来说,IronPDF 可能是一个更好的选择,因为免费试用版可以免费提供一些功能。

不过,对于大型项目或有特定许可要求的项目,iTextSharp 可能是一个更好的选择,因为它具有双重许可模式并支持 AGPL。

结论

IronPDF 和 iTextSharp 是用 C# 处理 PDF 文件的两个流行库。 虽然这两个库为处理 PDF 文档提供了类似的功能,但它们之间也存在一些差异,开发人员在选择使用哪个库时应加以考虑。

从技术角度看,IronPDF 是一个现代化的 .NET 库,它提供了一个简单直观的 API 来处理 PDF 文件。 它支持多种 PDF 功能,包括文本、图像、表单和数字签名。 IronPDF 还提供 HTML 到 PDF 的转换和 PDF 编辑等高级功能。

另一方面,iTextSharp 是一个成熟的 PDF 库,其 API 更为复杂,可能需要花费更多精力来学习。 不过,iTextSharp 提供了高级功能,如低级 PDF 操作和对各种 PDF 标准的支持。

在许可方面,IronPDF 提供简单的商业许可模式,允许开发人员在专有软件中使用该库,而无需发布源代码。 这使得开发人员更容易在商业项目中使用 IronPDF,而不必担心许可证合规性问题。 另一方面,iTextSharp 提供双重许可模式,即免费的 AGPL 许可和专有软件的商业许可。 虽然这为开发人员提供了更大的灵活性,但操作起来也可能更加复杂。

从技术角度看,IronPDF 提供了更现代、更直观的应用程序接口,开发人员可能更容易使用。 此外,IronPDF 还提供 HTML 到 PDF 的转换和 PDF 编辑等高级功能,这些功能可能对某些项目有用。 不过,iTextSharp 提供了更高级的功能,如低级 PDF 操作和对各种 PDF 标准的支持。

IronPDF 用户可在 免费试用 并可 特许 用于商业用途,其精简版套餐起价仅为 499 美元。

最后,IronPDF 推出了一项特别促销活动,开发人员可以用两套软件的价格购买全部 6 套 Iron 软件产品 铁软件 产品 这可以让开发人员以实惠的价格使用各种功能强大的 .NET 库。

< 前一页
在Windows上Wkhtmltopdf与IronPDF的比较
下一步 >
IronPDF与ExpertPDF for .NET的比较

准备开始了吗? 版本: 2024.9 刚刚发布

免费NuGet下载 总下载量: 10,731,156 查看许可证 >