C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C# Word添加数字签名

C#代码实现在Word文档中添加数字签名

作者:2501_93070778

数字签名可用于确认数字文档的来源真实性,并确保文档在传输过程中未被篡改,本文将介绍如何在 C# 和 VB.NET 中为 Word 文档添加数字签名,感兴趣的小伙伴可以了解下

数字签名可用于确认数字文档的来源真实性,并确保文档在传输过程中未被篡改。使用数字签名能够减少纸质文件的传递需求,同时降低文档打印、邮寄和存储的成本,从而节省时间和费用。本文将介绍如何在 C# 和 VB.NET 中为 Word 文档添加数字签名。

安装相关组件

在开始之前,需要先在 .NET 项目中添加所需的 DLL 引用。您可以通过下载安装包手动添加 DLL 文件,也可以直接通过 NuGet 进行安装。

PM> Install-Package Spire.Doc

在 C#、VB.NET 中为 Word 添加数字签名

实现过程如下:

此外,还可以使用以下方法对 Word 文档进行数字签名:

public void SaveToFile(string fileName, FileFormat fileFormat, byte[] certificateData, string securePassword);
public void SaveToStream(Stream stream, FileFormat fileFormat, byte[] certificateData, string securePassword);
public void SaveToStream(Stream stream, FileFormat fileFormat, string certificatePath, string securePassword);
public static byte[] Document.Sign(Stream sourceStream, byte[] certificateData, string securePassword);
public static byte[] Document.Sign(Stream sourceStream, string certificatePath, string securePassword);

完整示例代码

完整代码如下:

using Spire.Doc;
namespace DigitallySignWord
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建 Document 对象
            Document doc = new Document();
            // 加载 Word 文件
            doc.LoadFromFile("C:\\Users\\Administrator\\Desktop\\sample.docx");
            // 指定数字证书路径
            string certificatePath = "C:\\Users\\Administrator\\Desktop\\gary.pfx";
            // 指定证书密码
            string password = "e-iceblue";
            // 在保存为 .docx 文件时为文档添加数字签名
            doc.SaveToFile("AddDigitalSignature.docx", FileFormat.Docx2013, certificatePath, password);
        }
    }
}

知识扩展

给 Word 文档添加数字签名,在 C# 中有多种实现方式。以下是几种主流方案的完整代码示例和使用说明。

数字签名与数字证书

在开始编码之前,需要理解两个基础概念:

你需要准备一个有效的 .pfx 证书文件及其密码才能进行数字签名。若无可用证书,可通过 I love PDF 获取权威 CA 签发的证书,或使用 OpenSSL 生成自签名证书用于开发测试。

方案一:Aspose.Words for .NET(推荐)

Aspose.Words 是功能最全面的商业库,支持基础签名、签名行添加、批量签名等多种场景。

步骤 1:安装 NuGet 包

在 Visual Studio 的“程序包管理器控制台”中执行:

Install-Package Aspose.Words

步骤 2:导入必要的命名空间

using Aspose.Words;
using Aspose.Words.Saving;
using System.Security.Cryptography.X509Certificates;

场景 A:为现有 Word 文档添加数字签名(基础版)

using Aspose.Words;
using Aspose.Words.Saving;
string dataDir = @"C:\YourDocumentDirectory\";
// 加载数字证书
CertificateHolder certHolder = CertificateHolder.Create(dataDir + "morzal.pfx", "aw");
// 加载待签名的 Word 文档
Document doc = new Document(dataDir + "Digitally signed.docx");
// 对文档进行数字签名并保存
DigitalSignatureUtil.Sign(dataDir + "Digitally signed.docx", 
                          dataDir + "Document.Signed.docx", 
                          certHolder);

代码说明:DigitalSignatureUtil.Sign 的第一个参数是原始文档路径,第二个是签名后的输出路径,第三个是证书持有者。

场景 B:为文档添加签名行并签名(可视化签名)

如果希望在文档中创建一个可视化的签名行区域,可以使用以下代码:

using Aspose.Words;
using Aspose.Words.Drawing;
using Aspose.Words.Signing;
string dataDir = @"C:\YourDocumentDirectory\";
// 创建新文档
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// 插入签名行
SignatureLine signatureLine = builder.InsertSignatureLine(new SignatureLineOptions()).SignatureLine;
// 保存带有签名行的中间文档
doc.Save(dataDir + "SignDocuments.SignatureLine.docx");
// 配置签名选项
SignOptions signOptions = new SignOptions
{
    SignatureLineId = signatureLine.Id,
    SignatureLineImage = File.ReadAllBytes(dataDir + "signature_image.png")  // 可选签名图像
};
// 加载证书
CertificateHolder certHolder = CertificateHolder.Create(dataDir + "morzal.pfx", "aw");
// 对包含签名行的文档进行数字签名
DigitalSignatureUtil.Sign(dataDir + "SignDocuments.SignatureLine.docx",
                          dataDir + "SignDocuments.NewSignatureLine.docx",
                          certHolder, signOptions);

场景 C:批量签名多个文档

string[] documents = { "doc1.docx", "doc2.docx", "doc3.docx" };
string certPath = @"C:\Cert\mycert.pfx";
string password = "your_password";
string outputDir = @"C:\SignedOutput\";
CertificateHolder certHolder = CertificateHolder.Create(certPath, password);
foreach (string docName in documents)
{
    string inputPath = Path.Combine(dataDir, docName);
    string outputPath = Path.Combine(outputDir, "signed_" + docName);
    DigitalSignatureUtil.Sign(inputPath, outputPath, certHolder);
    Console.WriteLine($"已签名: {docName}");
}

方案二:Spire.Doc for .NET

Spire.Doc 是国内团队开发的高性能 Word 文档处理库,无需安装 Microsoft Office,且原生支持 WPS 格式。

步骤 1:安装 NuGet 包

Install-Package Spire.Doc

步骤 2:基础签名代码

using Spire.Doc;
namespace DigitallySignWord
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建 Document 对象
            Document doc = new Document();
            // 加载 Word 文档
            doc.LoadFromFile(@"C:\sample.docx");
            // 指定 .pfx 证书路径和密码
            string certificatePath = @"C:\cert\gary.pfx";
            string password = "your_cert_password";
            // 保存文档并添加数字签名
            doc.SaveToFile("AddDigitalSignature.docx", 
                           FileFormat.Docx2013, 
                           certificatePath, 
                           password);
        }
    }
}

更多签名方式(SaveToStream / Sign 静态方法)

Spire.Doc 提供多种签名方式:

方式一:保存到流(SaveToStream)

Document doc = new Document("sample.docx");
FileStream fs = new FileStream("output.docx", FileMode.Create);
doc.SaveToStream(fs, FileFormat.Docx2013, "gary.pfx", "e-iceblue");
fs.Flush();

方式二:静态 Sign 方法

FileStream fs = File.OpenRead("sample.docx");
byte[] result = Document.Sign(fs, "gary.pfx", "e-iceblue");
File.WriteAllBytes("AddDigitalSignature.docx", result);

方案三:GroupDocs.Signature for .NET

GroupDocs.Signature 支持超过 60 种文件格式,提供了更丰富的签名选项(文本、图像、二维码、条形码等)。

步骤 1:安装 NuGet 包

dotnet add package GroupDocs.Signature

步骤 2:基础签名代码

using GroupDocs.Signature;
using GroupDocs.Signature.Options;
using (Signature signature = new Signature("input.docx"))
{
    DigitalSignOptions options = new DigitalSignOptions("certificate.pfx")
    {
        Password = "1234567890",                     // 证书密码
        PageNumber = 1,                               // 签名所在页码
        Left = 50,                                    // 距左侧距离(像素)
        Top = 50,                                     // 距顶部距离(像素)
        Reason = "Document security check",           // 签名原因
        Contact = "John Smith",                       // 联系人信息
        Location = "Office D.W."                      // 签名地点
    };
    SignResult result = signature.Sign("output.docx", options);
}

场景 B:带可视化呈现的签名

DigitalSignOptions options = new DigitalSignOptions("certificate.pfx")
{
    Password = "1234567890",
    Reason = "Security issue",
    Contact = "John Smith",
    Location = "Office D.W.",
    ImageFilePath = "signature.png",                  // 指定签名图像
    AllPages = true,                                  // 在所有页面上显示
    VerticalAlignment = VerticalAlignment.Center,     // 垂直对齐方式
    HorizontalAlignment = HorizontalAlignment.Left,   // 水平对齐方式
    Width = 60,                                       // 签名宽度
    Height = 80,                                      // 签名高度
    Margin = new Padding() { Bottom = 10, Right = 10 }
};

方案四:GemBox.Document(轻量级)

GemBox.Document 是一个轻量级的高性能库,API 设计简洁。

步骤 1:安装 NuGet 包

Install-Package GemBox.Document

步骤 2:基础签名代码

using GemBox.Document;
class Program
{
    static void Main()
    {
        ComponentInfo.SetLicense("FREE-LIMITED-KEY");  // 免费版需要 License Key
        var document = DocumentModel.Load("input.docx");
        var saveOptions = new DocxSaveOptions();
        saveOptions.DigitalSignatures.Add(new DocxDigitalSignatureSaveOptions()
        {
            CertificatePath = "certificate.pfx",
            CertificatePassword = "your_password"
        });
        document.Save("signed_output.docx", saveOptions);
    }
}

方案五:Wordize(专门签名方案)

Wordize 专注于 Word 文档的数字签名功能。

using Wordize.DigitalSignatures;
CertificateHolder certificateHolder = CertificateHolder.Create("certificate.pfx", "Password");
Signer.Sign("input.docx", "output.docx", certificateHolder);

各方案对比

方案安装命令核心类/方法特点
Aspose.WordsInstall-Package Aspose.WordsDigitalSignatureUtil.Sign()功能最全,支持签名行、批量签名,稳定性高
Spire.DocInstall-Package Spire.DocDocument.SaveToFile()国产库,兼容 WPS,轻量易用
GroupDocs.Signaturedotnet add package GroupDocs.SignatureSignature.Sign()支持 60+ 种文件格式,签名类型丰富
GemBox.DocumentInstall-Package GemBox.DocumentDocxSaveOptions.DigitalSignatures轻量级高性能,API 简洁
Wordize官方 SDKSigner.Sign()专门针对 Word 签名,功能聚焦

总结

本文介绍了如何在 C# 和 VB.NET 中为 Word 文档添加数字签名。通过加载 Word 文件、指定 .pfx 数字证书及密码,并在保存文档时应用签名,即可快速实现文档的身份验证与内容保护。

数字签名不仅能够验证文档来源,还能有效防止文档在传输过程中被篡改,从而提升文档的安全性和可信度。此外,相关 API 还支持通过文件流、字节数组等多种方式进行签名,能够满足不同开发场景下的自动化办公需求。

到此这篇关于C#代码实现在Word文档中添加数字签名的文章就介绍到这了,更多相关C# Word添加数字签名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文