利用C#在PDF文檔中添加電子簽名的實(shí)現(xiàn)流程
引言
電子簽名在文檔合規(guī)性與安全性保障中扮演著重要角色,基于 C# 開發(fā) PDF 電子簽名功能是企業(yè)級(jí)文檔處理場(chǎng)景的常見需求。Spire.PDF for .NET 作為國(guó)產(chǎn) PDF 處理類庫(kù),無需依賴 Adobe Acrobat 等第三方軟件,即可便捷實(shí)現(xiàn) PDF 電子簽名添加。本文將介紹該類庫(kù)的使用方式、PDF 電子簽名的實(shí)現(xiàn)流程、解析關(guān)鍵代碼參數(shù)等。
一、前置準(zhǔn)備
1. 安裝 .NET 庫(kù)
通過 NuGet 包管理器快速安裝:
Install-Package Spire.PDF
2. 核心依賴說明
實(shí)現(xiàn)電子簽名需依賴 .pfx 格式的數(shù)字證書(包含私鑰):
- 測(cè)試場(chǎng)景:可通過 OpenSSL、Windows 證書管理器生成自簽名證書;
- 生產(chǎn)場(chǎng)景:需使用 CA 機(jī)構(gòu)頒發(fā)的合規(guī)證書(符合《電子簽名法》要求);
- 證書加載:通過
System.Security.Cryptography.X509Certificates.X509Certificate2類解析 .pfx 文件,是本次實(shí)現(xiàn)的核心依賴。
二、核心實(shí)現(xiàn)邏輯
PdfOrdinarySignatureMaker 是 Spire.PDF 中面向普通電子簽名的核心類,其核心流程為:
加載 PDF 文檔 → 解析 X.509 證書→ 初始化簽名器 → 執(zhí)行簽名 → 保存文檔。
以下基于該類實(shí)現(xiàn)基礎(chǔ)簽名功能,并擴(kuò)展添加可見簽名等進(jìn)階示例。
1. 基礎(chǔ)版:添加基礎(chǔ)電子簽名(默認(rèn)不可見)
適用于僅需驗(yàn)簽、無需視覺標(biāo)識(shí)的場(chǎng)景,核心代碼附帶詳細(xì)注釋:
using Spire.Pdf;
using Spire.Pdf.Interactive.DigitalSignatures;
using System;
using System.Security.Cryptography.X509Certificates;
namespace PdfDigitalSignature
{
class BasicSignatureDemo
{
static void Main(string[] args)
{
try
{
// 1. 加載待簽名的 PDF 文檔
using (PdfDocument pdfDoc = new PdfDocument())
{
pdfDoc.LoadFromFile("Input.pdf"); // 替換為實(shí)際文件路徑
// 2. 加載數(shù)字證書(指定密鑰存儲(chǔ)策略,適配服務(wù)器/客戶端環(huán)境)
string certPath = "certificate.pfx"; // 替換為證書實(shí)際路徑
string certPassword = "abc123"; // 替換為證書密碼
X509Certificate2 cert = new X509Certificate2(
certPath,
certPassword,
// 關(guān)鍵標(biāo)志:適配服務(wù)器環(huán)境+避免密鑰持久化,提升安全性
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet
);
// 3. 初始化簽名器并執(zhí)行簽名
PdfOrdinarySignatureMaker signMaker = new PdfOrdinarySignatureMaker(pdfDoc, cert);
// 簽名名稱:用于后續(xù)識(shí)別/驗(yàn)證簽名,建議唯一
signMaker.MakeSignature("Basic_Signature_001");
// 4. 保存簽名后的文檔
pdfDoc.SaveToFile("Signed_Basic.pdf");
Console.WriteLine("不可見簽名添加成功!");
}
}
catch (Exception ex)
{
Console.WriteLine($"簽名失?。簕ex.Message}");
// 進(jìn)階:記錄異常詳情(如堆棧)便于排查
Console.WriteLine($"異常詳情:{ex.StackTrace}");
}
}
}
}
2. 進(jìn)階版:添加可見簽名
在基礎(chǔ)簽名上擴(kuò)展視覺標(biāo)識(shí)(含簽名圖片、文本信息),適用于需要直觀展示簽名的場(chǎng)景:
using Spire.Pdf;
using Spire.Pdf.Interactive.DigitalSignatures;
using System;
using System.Drawing;
using System.Security.Cryptography.X509Certificates;
namespace PdfDigitalSignature
{
class AdvancedSignatureDemo
{
static void Main(string[] args)
{
try
{
// 1. 加載 PDF 文檔(using 自動(dòng)釋放資源)
using (PdfDocument pdfDoc = new PdfDocument())
{
pdfDoc.LoadFromFile("Input.pdf");
// 2. 加載數(shù)字證書
string certPath = "certificate.pfx";
string certPassword = "abc123";
X509Certificate2 cert = new X509Certificate2(
certPath,
certPassword,
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet
);
// 3. 初始化簽名器
PdfOrdinarySignatureMaker signMaker = new PdfOrdinarySignatureMaker(pdfDoc, cert);
PdfSignature signature = signMaker.Signature;
// 4. 配置簽名元信息(將顯示在簽名外觀中)
signature.Name = "XX科技有限公司"; // 簽名者名稱
signature.ContactInfo = "010-12345678"; // 聯(lián)系信息
signature.Location = "中國(guó)·北京"; // 簽名地點(diǎn)
signature.Reason = "確認(rèn)文檔內(nèi)容合規(guī)有效";// 簽名原因
// 5. 配置簽名可視化外觀
PdfSignatureAppearance appearance = new PdfSignatureAppearance(signature);
// 自定義標(biāo)簽文本
appearance.NameLabel = "簽名主體:";
appearance.ContactInfoLabel = "聯(lián)系電話:";
appearance.LocationLabel = "簽署地點(diǎn):";
appearance.ReasonLabel = "簽署原因:";
// 添加簽名圖片(支持 PNG/JPG 等格式)
PdfImage signImage = PdfImage.FromFile("signature.png"); // 替換為簽名圖片路徑
appearance.SignatureImage = signImage;
// 布局模式:圖片 + 文本(可選:SignImageOnly/僅圖片;SignDetailOnly/僅文本)
appearance.GraphicMode = GraphicMode.SignImageAndSignDetail;
// 6. 綁定外觀并添加到指定位置
signMaker.SignatureAppearance = appearance;
// 獲取目標(biāo)頁(yè)面(示例:最后一頁(yè))
PdfPageBase targetPage = pdfDoc.Pages[pdfDoc.Pages.Count - 1];
// MakeSignature 參數(shù)說明:簽名名稱、目標(biāo)頁(yè)面、X坐標(biāo)、Y坐標(biāo)、寬度、高度、外觀
signMaker.MakeSignature("Advanced_Signature_001", targetPage,
54.0f, 330.0f, 280.0f, 90.0f, appearance);
// 7. 保存文檔
pdfDoc.SaveToFile("Signed_Advanced.pdf");
Console.WriteLine("可視化簽名添加成功!");
}
}
catch (Exception ex)
{
Console.WriteLine($"簽名失?。簕ex.Message}");
Console.WriteLine($"異常詳情:{ex.StackTrace}");
}
}
}
}
三、關(guān)鍵參數(shù)與類說明
PdfOrdinarySignatureMaker:核心簽名器類,關(guān)聯(lián)PDF文檔與 X.509 證書,執(zhí)行簽名操作。X509Certificate2:加載 .pfx 格式數(shù)字證書,解析私鑰與公鑰。X509KeyStorageFlags:密鑰存儲(chǔ)標(biāo)志,控制證書加載的存儲(chǔ)區(qū)與密鑰生命周期MachineKeySet適配服務(wù)器環(huán)境EphemeralKeySet提升安全性
PdfSignatureAppearance:配置可見簽名的外觀,包括簽名框位置、文本信息等。GraphicMode:可見簽名布局樣式 (參數(shù):SignImageOnly(僅圖片),SignDetailOnly(僅文本),SignImageAndSignDetail(圖片+文本))MakeSignature:執(zhí)行簽名方法。
四、注意事項(xiàng)
- 證書安全:.pfx 證書包含私鑰,需加密存儲(chǔ),避免硬編碼密碼,建議通過配置文件/密鑰管理服務(wù)管理;
- 權(quán)限適配:服務(wù)器環(huán)境下加載證書需賦予應(yīng)用程序足夠的密鑰訪問權(quán)限,避免
CryptographicException; - 兼容性測(cè)試:簽名后的 PDF 需在 Adobe Acrobat、WPS、瀏覽器等主流閱讀器中驗(yàn)證顯示與簽名有效性;
五、總結(jié)
基于 Spire.PDF for .NET 的 C# 實(shí)現(xiàn)方案,以 “輕量化、低門檻、易集成” 為核心優(yōu)勢(shì),僅需數(shù)十行代碼即可完成 PDF 電子簽名的基礎(chǔ)與進(jìn)階功能。該方案適配 .NET Framework/.NET Core/.NET 5+ 全框架,能快速落地到企業(yè)級(jí)文檔處理系統(tǒng)中。如需更高的安全性與合規(guī)性,可結(jié)合 CA 證書、時(shí)間戳服務(wù)進(jìn)一步擴(kuò)展。
以上就是利用C#在PDF文檔中添加電子簽名的實(shí)現(xiàn)流程的詳細(xì)內(nèi)容,更多關(guān)于C# PDF文檔添加電子簽名的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C# 獲取進(jìn)程退出代碼的實(shí)現(xiàn)示例
這篇文章主要介紹了C# 獲取進(jìn)程退出代碼的實(shí)現(xiàn)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02
C#使用Socket實(shí)現(xiàn)局域網(wǎng)聊天
這篇文章主要為大家詳細(xì)介紹了C#使用Socket實(shí)現(xiàn)局域網(wǎng)聊天的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
C#發(fā)送和接收HTTP請(qǐng)求類HttpWebRequest的用法
這篇文章主要給大家介紹了關(guān)于C#發(fā)送和接收HTTP請(qǐng)求類HttpWebRequest用法的相關(guān)資料,C#中的HttpWebRequest是一個(gè)用于發(fā)送HTTP請(qǐng)求的類,它可以用于向Web服務(wù)器發(fā)送GET、POST、PUT、DELETE等請(qǐng)求,需要的朋友可以參考下2024-06-06
C#實(shí)現(xiàn)代碼在PowerPoint演示文稿中添加超鏈接
超鏈接是一種可點(diǎn)擊的元素,通常嵌入在文本或圖片中,本文將演示如何使用 Spire.Presentation for .NET 在 PowerPoint 中以編程方式添加超鏈接,有需要的小伙伴可以了解下2026-03-03

