C#代碼實(shí)現(xiàn)在Word文檔中添加數(shù)字簽名
數(shù)字簽名可用于確認(rèn)數(shù)字文檔的來(lái)源真實(shí)性,并確保文檔在傳輸過(guò)程中未被篡改。使用數(shù)字簽名能夠減少紙質(zhì)文件的傳遞需求,同時(shí)降低文檔打印、郵寄和存儲(chǔ)的成本,從而節(jié)省時(shí)間和費(fèi)用。本文將介紹如何在 C# 和 VB.NET 中為 Word 文檔添加數(shù)字簽名。
安裝相關(guān)組件
在開(kāi)始之前,需要先在 .NET 項(xiàng)目中添加所需的 DLL 引用。您可以通過(guò)下載安裝包手動(dòng)添加 DLL 文件,也可以直接通過(guò) NuGet 進(jìn)行安裝。
PM> Install-Package Spire.Doc
在 C#、VB.NET 中為 Word 添加數(shù)字簽名
實(shí)現(xiàn)過(guò)程如下:
- 創(chuàng)建 Document 對(duì)象。
- 使用 Document.LoadFromFile() 方法加載 Word 文檔。
- 指定 .pfx 證書(shū)文件的路徑以及密碼。
- 在保存文檔時(shí),通過(guò) Document.SaveToFile(string fileName, FileFormat fileFormat, string certificatePath, string securePassword) 方法為文檔添加數(shù)字簽名。
此外,還可以使用以下方法對(duì) Word 文檔進(jìn)行數(shù)字簽名:
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)
{
// 創(chuàng)建 Document 對(duì)象
Document doc = new Document();
// 加載 Word 文件
doc.LoadFromFile("C:\\Users\\Administrator\\Desktop\\sample.docx");
// 指定數(shù)字證書(shū)路徑
string certificatePath = "C:\\Users\\Administrator\\Desktop\\gary.pfx";
// 指定證書(shū)密碼
string password = "e-iceblue";
// 在保存為 .docx 文件時(shí)為文檔添加數(shù)字簽名
doc.SaveToFile("AddDigitalSignature.docx", FileFormat.Docx2013, certificatePath, password);
}
}
}知識(shí)擴(kuò)展
給 Word 文檔添加數(shù)字簽名,在 C# 中有多種實(shí)現(xiàn)方式。以下是幾種主流方案的完整代碼示例和使用說(shuō)明。
數(shù)字簽名與數(shù)字證書(shū)
在開(kāi)始編碼之前,需要理解兩個(gè)基礎(chǔ)概念:
- 數(shù)字簽名:一種電子形式的簽名,用于驗(yàn)證簽名者的身份并確保文檔未被篡改。
- 數(shù)字證書(shū)(.pfx 文件):創(chuàng)建數(shù)字簽名的關(guān)鍵,包含公鑰和簽名者的身份信息,供他人驗(yàn)證簽名真?zhèn)巍?/li>
你需要準(zhǔn)備一個(gè)有效的 .pfx 證書(shū)文件及其密碼才能進(jìn)行數(shù)字簽名。若無(wú)可用證書(shū),可通過(guò) I love PDF 獲取權(quán)威 CA 簽發(fā)的證書(shū),或使用 OpenSSL 生成自簽名證書(shū)用于開(kāi)發(fā)測(cè)試。
方案一:Aspose.Words for .NET(推薦)
Aspose.Words 是功能最全面的商業(yè)庫(kù),支持基礎(chǔ)簽名、簽名行添加、批量簽名等多種場(chǎng)景。
步驟 1:安裝 NuGet 包
在 Visual Studio 的“程序包管理器控制臺(tái)”中執(zhí)行:
Install-Package Aspose.Words
步驟 2:導(dǎo)入必要的命名空間
using Aspose.Words; using Aspose.Words.Saving; using System.Security.Cryptography.X509Certificates;
場(chǎng)景 A:為現(xiàn)有 Word 文檔添加數(shù)字簽名(基礎(chǔ)版)
using Aspose.Words;
using Aspose.Words.Saving;
string dataDir = @"C:\YourDocumentDirectory\";
// 加載數(shù)字證書(shū)
CertificateHolder certHolder = CertificateHolder.Create(dataDir + "morzal.pfx", "aw");
// 加載待簽名的 Word 文檔
Document doc = new Document(dataDir + "Digitally signed.docx");
// 對(duì)文檔進(jìn)行數(shù)字簽名并保存
DigitalSignatureUtil.Sign(dataDir + "Digitally signed.docx",
dataDir + "Document.Signed.docx",
certHolder);代碼說(shuō)明:DigitalSignatureUtil.Sign 的第一個(gè)參數(shù)是原始文檔路徑,第二個(gè)是簽名后的輸出路徑,第三個(gè)是證書(shū)持有者。
場(chǎng)景 B:為文檔添加簽名行并簽名(可視化簽名)
如果希望在文檔中創(chuàng)建一個(gè)可視化的簽名行區(qū)域,可以使用以下代碼:
using Aspose.Words;
using Aspose.Words.Drawing;
using Aspose.Words.Signing;
string dataDir = @"C:\YourDocumentDirectory\";
// 創(chuàng)建新文檔
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// 插入簽名行
SignatureLine signatureLine = builder.InsertSignatureLine(new SignatureLineOptions()).SignatureLine;
// 保存帶有簽名行的中間文檔
doc.Save(dataDir + "SignDocuments.SignatureLine.docx");
// 配置簽名選項(xiàng)
SignOptions signOptions = new SignOptions
{
SignatureLineId = signatureLine.Id,
SignatureLineImage = File.ReadAllBytes(dataDir + "signature_image.png") // 可選簽名圖像
};
// 加載證書(shū)
CertificateHolder certHolder = CertificateHolder.Create(dataDir + "morzal.pfx", "aw");
// 對(duì)包含簽名行的文檔進(jìn)行數(shù)字簽名
DigitalSignatureUtil.Sign(dataDir + "SignDocuments.SignatureLine.docx",
dataDir + "SignDocuments.NewSignatureLine.docx",
certHolder, signOptions);場(chǎng)景 C:批量簽名多個(gè)文檔
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 是國(guó)內(nèi)團(tuán)隊(duì)開(kāi)發(fā)的高性能 Word 文檔處理庫(kù),無(wú)需安裝 Microsoft Office,且原生支持 WPS 格式。
步驟 1:安裝 NuGet 包
Install-Package Spire.Doc
步驟 2:基礎(chǔ)簽名代碼
using Spire.Doc;
namespace DigitallySignWord
{
class Program
{
static void Main(string[] args)
{
// 創(chuàng)建 Document 對(duì)象
Document doc = new Document();
// 加載 Word 文檔
doc.LoadFromFile(@"C:\sample.docx");
// 指定 .pfx 證書(shū)路徑和密碼
string certificatePath = @"C:\cert\gary.pfx";
string password = "your_cert_password";
// 保存文檔并添加數(shù)字簽名
doc.SaveToFile("AddDigitalSignature.docx",
FileFormat.Docx2013,
certificatePath,
password);
}
}
}更多簽名方式(SaveToStream / Sign 靜態(tài)方法)
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();方式二:靜態(tài) 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 支持超過(guò) 60 種文件格式,提供了更豐富的簽名選項(xiàng)(文本、圖像、二維碼、條形碼等)。
步驟 1:安裝 NuGet 包
dotnet add package GroupDocs.Signature
步驟 2:基礎(chǔ)簽名代碼
using GroupDocs.Signature;
using GroupDocs.Signature.Options;
using (Signature signature = new Signature("input.docx"))
{
DigitalSignOptions options = new DigitalSignOptions("certificate.pfx")
{
Password = "1234567890", // 證書(shū)密碼
PageNumber = 1, // 簽名所在頁(yè)碼
Left = 50, // 距左側(cè)距離(像素)
Top = 50, // 距頂部距離(像素)
Reason = "Document security check", // 簽名原因
Contact = "John Smith", // 聯(lián)系人信息
Location = "Office D.W." // 簽名地點(diǎn)
};
SignResult result = signature.Sign("output.docx", options);
}場(chǎng)景 B:帶可視化呈現(xiàn)的簽名
DigitalSignOptions options = new DigitalSignOptions("certificate.pfx")
{
Password = "1234567890",
Reason = "Security issue",
Contact = "John Smith",
Location = "Office D.W.",
ImageFilePath = "signature.png", // 指定簽名圖像
AllPages = true, // 在所有頁(yè)面上顯示
VerticalAlignment = VerticalAlignment.Center, // 垂直對(duì)齊方式
HorizontalAlignment = HorizontalAlignment.Left, // 水平對(duì)齊方式
Width = 60, // 簽名寬度
Height = 80, // 簽名高度
Margin = new Padding() { Bottom = 10, Right = 10 }
};方案四:GemBox.Document(輕量級(jí))
GemBox.Document 是一個(gè)輕量級(jí)的高性能庫(kù),API 設(shè)計(jì)簡(jiǎn)潔。
步驟 1:安裝 NuGet 包
Install-Package GemBox.Document
步驟 2:基礎(chǔ)簽名代碼
using GemBox.Document;
class Program
{
static void Main()
{
ComponentInfo.SetLicense("FREE-LIMITED-KEY"); // 免費(fèi)版需要 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 文檔的數(shù)字簽名功能。
using Wordize.DigitalSignatures;
CertificateHolder certificateHolder = CertificateHolder.Create("certificate.pfx", "Password");
Signer.Sign("input.docx", "output.docx", certificateHolder);各方案對(duì)比
| 方案 | 安裝命令 | 核心類/方法 | 特點(diǎn) |
|---|---|---|---|
| Aspose.Words | Install-Package Aspose.Words | DigitalSignatureUtil.Sign() | 功能最全,支持簽名行、批量簽名,穩(wěn)定性高 |
| Spire.Doc | Install-Package Spire.Doc | Document.SaveToFile() | 國(guó)產(chǎn)庫(kù),兼容 WPS,輕量易用 |
| GroupDocs.Signature | dotnet add package GroupDocs.Signature | Signature.Sign() | 支持 60+ 種文件格式,簽名類型豐富 |
| GemBox.Document | Install-Package GemBox.Document | DocxSaveOptions.DigitalSignatures | 輕量級(jí)高性能,API 簡(jiǎn)潔 |
| Wordize | 官方 SDK | Signer.Sign() | 專門針對(duì) Word 簽名,功能聚焦 |
總結(jié)
本文介紹了如何在 C# 和 VB.NET 中為 Word 文檔添加數(shù)字簽名。通過(guò)加載 Word 文件、指定 .pfx 數(shù)字證書(shū)及密碼,并在保存文檔時(shí)應(yīng)用簽名,即可快速實(shí)現(xiàn)文檔的身份驗(yàn)證與內(nèi)容保護(hù)。
數(shù)字簽名不僅能夠驗(yàn)證文檔來(lái)源,還能有效防止文檔在傳輸過(guò)程中被篡改,從而提升文檔的安全性和可信度。此外,相關(guān) API 還支持通過(guò)文件流、字節(jié)數(shù)組等多種方式進(jìn)行簽名,能夠滿足不同開(kāi)發(fā)場(chǎng)景下的自動(dòng)化辦公需求。
到此這篇關(guān)于C#代碼實(shí)現(xiàn)在Word文檔中添加數(shù)字簽名的文章就介紹到這了,更多相關(guān)C# Word添加數(shù)字簽名內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于C#設(shè)計(jì)一個(gè)雙色球選號(hào)工具
這篇文章主要為大家詳細(xì)介紹了如何利用C#設(shè)計(jì)實(shí)現(xiàn)一個(gè)雙色球選號(hào)工具,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
C#中Invoke和BeginInvoke區(qū)別小結(jié)
有時(shí)候,我們不得不跨線程調(diào)用主界面的控件來(lái)進(jìn)行操作,所以為了方便的解決問(wèn)題,.net為我們提供了Invoke?與beginInvoke,那么Invoke和BeginInvoke區(qū)別在哪,本文就來(lái)詳細(xì)的介紹一下2023-08-08
C# 使用PictureBox實(shí)現(xiàn)圖片按鈕控件的示例步驟
這篇文章主要介紹了C# 使用PictureBox實(shí)現(xiàn)圖片按鈕控件的示例步驟,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-02-02
解析XPath語(yǔ)法之在C#中使用XPath的示例詳解
本篇文章是對(duì)在C#中使用XPath的示例進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
使用c#實(shí)現(xiàn)微信自動(dòng)化功能
這篇文章主要介紹了使用c#實(shí)現(xiàn)微信自動(dòng)化,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
c#實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能示例分享
這篇文章主要介紹了c#實(shí)現(xiàn)的斷點(diǎn)續(xù)傳功能示例,斷點(diǎn)續(xù)傳就是在上一次下載時(shí)斷開(kāi)的位置開(kāi)始繼續(xù)下載。在HTTP協(xié)議中,可以在請(qǐng)求報(bào)文頭中加入Range段,來(lái)表示客戶機(jī)希望從何處繼續(xù)下載,下面是示例,需要的朋友可以參考下2014-03-03

