C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C#删除PDF数字签名

C#结合Free Spire.PDF实现删除PDF中的数字签名

作者:LAYONTHEGROUND

这篇文章主要为大家详细介绍了C#如何结合Free Spire.PDF实现删除PDF中的数字签名,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下

在 .NET 开发中处理 PDF 文档时,你大概率遇到过这个问题:拿到一份已添加数字签名的 PDF,想要修改内容、调整排版,却因签名保护无法编辑,任何操作都会触发报错。

其实解决方案非常简单:PDF 数字签名本质是嵌入在表单中的专属签名字段控件,无需复杂操作,用 C# 结合免费的 Free Spire.PDF 库,几行代码就能精准移除所有签名。

实现原理

PDF 中的数字签名,在底层是一个特殊类型的表单字段,对应类为 PdfSignatureFieldWidget

我们的核心逻辑就是:定位并删除这个签名字段,即可解除 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 安装。

重要注意事项

知识扩展

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数字签名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

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