C#結(jié)合Free?Spire.PDF實現(xiàn)刪除PDF中的數(shù)字簽名
在 .NET 開發(fā)中處理 PDF 文檔時,你大概率遇到過這個問題:拿到一份已添加數(shù)字簽名的 PDF,想要修改內(nèi)容、調(diào)整排版,卻因簽名保護無法編輯,任何操作都會觸發(fā)報錯。
其實解決方案非常簡單:PDF 數(shù)字簽名本質(zhì)是嵌入在表單中的專屬簽名字段控件,無需復(fù)雜操作,用 C# 結(jié)合免費的 Free Spire.PDF 庫,幾行代碼就能精準(zhǔn)移除所有簽名。
實現(xiàn)原理
PDF 中的數(shù)字簽名,在底層是一個特殊類型的表單字段,對應(yīng)類為 PdfSignatureFieldWidget。
我們的核心邏輯就是:定位并刪除這個簽名字段,即可解除 PDF 的簽名保護。
- 加載帶數(shù)字簽名的 PDF 文檔
- 獲取文檔內(nèi)的所有表單字段集合
- 倒序遍歷表單字段,篩選出簽名類型字段并刪除
- 保存處理后的新 PDF 文件
- 釋放文檔資源,避免內(nèi)存泄漏
完整代碼
using Spire.Pdf;
using Spire.Pdf.Widget;
namespace RemoveSignature
{
class Program
{
static void Main(string[] args)
{
// 加載要處理的PDF文件
PdfDocument pdf = new PdfDocument("C:\\Users\\Administrator\\Desktop\\Signature.pdf");
// 獲取文檔中的表單域集合
PdfFormWidget widgets = pdf.Form as PdfFormWidget;
// 倒序遍歷(防止刪除時索引錯位)
for (int i = widgets.FieldsWidget.List.Count - 1; i >= 0; i--)
{
PdfFieldWidget widget = widgets.FieldsWidget.List[i] as PdfFieldWidget;
// 判斷當(dāng)前字段是不是數(shù)字簽名字段
if (widget is PdfSignatureFieldWidget)
{
// 移除簽名
widgets.FieldsWidget.RemoveAt(i);
Console.WriteLine($"已移除第{i}個簽名字段");
}
}
// 保存結(jié)果
pdf.SaveToFile("RemoveSignatures.pdf");
Console.WriteLine("處理完成!");
// 記得釋放資源
pdf.Close();
}
}
}
關(guān)鍵點解析
1. 為什么必須倒序遍歷?
List.RemoveAt(i) 刪除元素后,列表后續(xù)元素的索引會自動前移。
- 正序遍歷:刪除元素后會跳過下一個字段,導(dǎo)致刪不干凈;
- 倒序遍歷:從最后一個元素往前刪,索引不會錯亂,是刪除集合元素的標(biāo)準(zhǔn)寫法。
2. 支持移除所有類型簽名
無論你要刪除的是:
- 頁面可見的簽名圖片/印章
- 后臺隱藏的電子驗證簽名
- 單個/多個數(shù)字簽名
- 該方法都能一鍵清除。
3. Free Spire.PDF 免費版限制
免費版有 PDF 頁數(shù)限制(≤10頁),完全滿足:
- 個人測試
- 小文件處理
- 企業(yè)內(nèi)部工具開發(fā)
環(huán)境配置(一步到位)
打開 Visual Studio 的 NuGet 包管理器控制臺,執(zhí)行以下命令安裝依賴庫:
Install-Package FreeSpire.PDF
或直接在 NuGet 搜索框中搜索:FreeSpire.PDF 安裝。
重要注意事項
- 務(wù)必備份原文件:代碼會生成新文件,不會覆蓋原文件,但操作重要文檔前,建議手動備份。
- 文件路徑格式:Windows 路徑建議加
@轉(zhuǎn)義(@"C:\Test.pdf"),避免轉(zhuǎn)義字符報錯。 - 法律效力提醒“”數(shù)字簽名通常具備法律效應(yīng),操作前請確認你擁有文件的修改/刪除權(quán)限,請勿違規(guī)操作。
知識擴展
1.C# 如何移除PDF文檔的數(shù)字簽名
using Spire.Pdf;
using Spire.Pdf.Widget;
namespace 移除PDF數(shù)字簽名
{
class Program
{
static void Main(string[] args)
{
PdfDocument pdf = newPdfDocument();
pdf.LoadFromFile("測試.pdf");
PdfFormWidget widgets = pdf.Form as PdfFormWidget;
for (int i = 0; i< widgets.FieldsWidget.List.Count; i++)
{
PdfFieldWidget widget =widgets.FieldsWidget.List[i] as PdfFieldWidget;
if (widget isPdfSignatureFieldWidget)
{
widgets.FieldsWidget.RemoveAt(i);
}
}
pdf.SaveToFile("移除簽名.pdf");
System.Diagnostics.Process.Start("移除簽名.pdf");
}
}
}2.C# PDF添加可信時間戳數(shù)字簽名
在進行簽名前,需要準(zhǔn)備以下資料:
1)數(shù)字證書和密碼;
2)時間戳服務(wù)器 的URL地址
using System.Drawing;
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Security;
namespace Digitally_Sign_Pdf_with_Timestamp
{
class Program
{
static void Main(string[] args)
{
//加載PDF文檔
PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile("Additional.pdf");
//獲取第一頁
PdfPageBase page = pdf.Pages[0];
//加載數(shù)字證書(.pfx文件)
PdfCertificate cert = new PdfCertificate("test.pfx", "123");
//加載一張圖片
Spire.Pdf.Graphics.PdfImage image = Spire.Pdf.Graphics.PdfImage.FromFile("Logo.jpg");
//添加跟圖片一樣大小的簽名到第一頁,并設(shè)置圖片為簽名圖片
Spire.Pdf.Security.PdfSignature signature = new Spire.Pdf.Security.PdfSignature(page.Document, page, cert, "sign1");
signature.Bounds = new RectangleF(new PointF(100, 300), new SizeF(image.Width, image.Height));
signature.SignImageSource = image;
signature.GraphicsMode = Spire.Pdf.Security.GraphicMode.SignImageAndSignDetail;
signature.SignImageLayout = Spire.Pdf.Security.SignImageLayout.Stretch;
signature.DocumentPermissions = Spire.Pdf.Security.PdfCertificationFlags.AllowFormFill | Spire.Pdf.Security.PdfCertificationFlags.AllowComments;
//配置時間戳服務(wù)器
string url = "http://timestamp.wosign.com/rfc3161";
signature.ConfigureTimestamp(url);
//保存文檔
pdf.SaveToFile("output.pdf");
}
}
}到此這篇關(guān)于C#結(jié)合Free Spire.PDF實現(xiàn)刪除PDF中的數(shù)字簽名的文章就介紹到這了,更多相關(guān)C#刪除PDF數(shù)字簽名內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#代碼實現(xiàn)在PowerPoint中創(chuàng)建編號或項目符號列表
列表是 PowerPoint 演示文稿中非常實用的工具,在本文中,我們將介紹如何使用 Spire.Presentation for .NET 在 C# 和 VB.NET 中創(chuàng)建 編號列表 和 項目符號列表,需要的可以了解下2026-02-02
C#使用FileInfo和DirectoryInfo類來執(zhí)行文件和文件夾操作
System.IO.FileInfo?和?System.IO.DirectoryInfo?是C#中用于操作文件和文件夾的類,它們提供了許多有用的方法和屬性來管理文件和文件夾,這篇文章主要介紹了C#使用FileInfo和DirectoryInfo類來執(zhí)行文件和文件夾操作,需要的朋友可以參考下2023-08-08
C# Winform截圖指定控件范圍內(nèi)的圖像的流程步驟
工作所需,需要截圖軟件跑出來的界面上的圖表,但是窗口本身是可以縮放的,圖表也是做的可以跟著窗體大小一起縮放,所以就寫了一個函數(shù),用于截圖圖表容器內(nèi)的圖像,文中有函數(shù)源碼供大家參考,需要的朋友可以參考下2024-10-10
DevExpress實現(xiàn)TreeList父子節(jié)點CheckState狀態(tài)同步的方法
這篇文章主要介紹了DevExpress實現(xiàn)TreeList父子節(jié)點CheckState狀態(tài)同步的方法,需要的朋友可以參考下2014-08-08
c# DevExpress gridcontrol日期行的顯示格式設(shè)置
這篇文章主要介紹了c# DevExpress gridcontrol日期行的顯示格式設(shè)置,需要的朋友可以參考下2017-02-02

