C#结合Free Spire.PDF实现删除PDF中的数字签名
在 .NET 开发中处理 PDF 文档时,你大概率遇到过这个问题:拿到一份已添加数字签名的 PDF,想要修改内容、调整排版,却因签名保护无法编辑,任何操作都会触发报错。
其实解决方案非常简单:PDF 数字签名本质是嵌入在表单中的专属签名字段控件,无需复杂操作,用 C# 结合免费的 Free Spire.PDF 库,几行代码就能精准移除所有签名。
实现原理
PDF 中的数字签名,在底层是一个特殊类型的表单字段,对应类为 PdfSignatureFieldWidget。
我们的核心逻辑就是:定位并删除这个签名字段,即可解除 PDF 的签名保护。
- 加载带数字签名的 PDF 文档
- 获取文档内的所有表单字段集合
- 倒序遍历表单字段,筛选出签名类型字段并删除
- 保存处理后的新 PDF 文件
- 释放文档资源,避免内存泄漏
完整代码
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;
// 判断当前字段是不是数字签名字段
if (widget is PdfSignatureFieldWidget)
{
// 移除签名
widgets.FieldsWidget.RemoveAt(i);
Console.WriteLine($"已移除第{i}个签名字段");
}
}
// 保存结果
pdf.SaveToFile("RemoveSignatures.pdf");
Console.WriteLine("处理完成!");
// 记得释放资源
pdf.Close();
}
}
}
关键点解析
1. 为什么必须倒序遍历?
List.RemoveAt(i) 删除元素后,列表后续元素的索引会自动前移。
- 正序遍历:删除元素后会跳过下一个字段,导致删不干净;
- 倒序遍历:从最后一个元素往前删,索引不会错乱,是删除集合元素的标准写法。
2. 支持移除所有类型签名
无论你要删除的是:
- 页面可见的签名图片/印章
- 后台隐藏的电子验证签名
- 单个/多个数字签名
- 该方法都能一键清除。
3. Free Spire.PDF 免费版限制
免费版有 PDF 页数限制(≤10页),完全满足:
- 个人测试
- 小文件处理
- 企业内部工具开发
环境配置(一步到位)
打开 Visual Studio 的 NuGet 包管理器控制台,执行以下命令安装依赖库:
Install-Package FreeSpire.PDF
或直接在 NuGet 搜索框中搜索:FreeSpire.PDF 安装。
重要注意事项
- 务必备份原文件:代码会生成新文件,不会覆盖原文件,但操作重要文档前,建议手动备份。
- 文件路径格式:Windows 路径建议加
@转义(@"C:\Test.pdf"),避免转义字符报错。 - 法律效力提醒“”数字签名通常具备法律效应,操作前请确认你拥有文件的修改/删除权限,请勿违规操作。
知识扩展
1.C# 如何移除PDF文档的数字签名
using Spire.Pdf;
using Spire.Pdf.Widget;
namespace 移除PDF数字签名
{
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添加可信时间戳数字签名
在进行签名前,需要准备以下资料:
1)数字证书和密码;
2)时间戳服务器 的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];
//加载数字证书(.pfx文件)
PdfCertificate cert = new PdfCertificate("test.pfx", "123");
//加载一张图片
Spire.Pdf.Graphics.PdfImage image = Spire.Pdf.Graphics.PdfImage.FromFile("Logo.jpg");
//添加跟图片一样大小的签名到第一页,并设置图片为签名图片
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;
//配置时间戳服务器
string url = "http://timestamp.wosign.com/rfc3161";
signature.ConfigureTimestamp(url);
//保存文档
pdf.SaveToFile("output.pdf");
}
}
}到此这篇关于C#结合Free Spire.PDF实现删除PDF中的数字签名的文章就介绍到这了,更多相关C#删除PDF数字签名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
混合语言编程—C#使用原生的Directx和OpenGL绘图的方法
本文要说的是混合C#和C/C++语言编程,在C#的Winform和WPF下使用原生的Direct和OpenGL进行绘图2013-09-09


最新评论