首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用itextsharp C#从签名字段中删除有效性未知图标?

iTextSharp是一个流行的C#库,用于处理PDF文件。它提供了丰富的功能,包括创建、编辑和处理PDF文档。在使用iTextSharp来删除签名字段中的有效性未知图标时,可以按照以下步骤进行操作:

  1. 导入iTextSharp库:首先,确保已将iTextSharp库添加到项目中。可以通过NuGet包管理器或手动下载并添加引用来完成此操作。
  2. 打开PDF文件:使用iTextSharp打开需要处理的PDF文件。可以使用PdfReader类来读取现有的PDF文档。
代码语言:txt
复制
PdfReader reader = new PdfReader("path/to/input.pdf");
  1. 获取签名字段:使用AcroFields类获取PDF文档中的签名字段。签名字段可以通过GetSignatureNames()方法获取。
代码语言:txt
复制
AcroFields fields = reader.AcroFields;
List<string> signatureNames = fields.GetSignatureNames();
  1. 删除有效性未知图标:遍历签名字段列表,检查每个签名字段的有效性状态。如果有效性状态为未知,则删除该字段的有效性未知图标。
代码语言:txt
复制
foreach (string signatureName in signatureNames)
{
    PdfDictionary signatureDict = fields.GetSignatureDictionary(signatureName);
    PdfName subFilter = signatureDict.GetAsName(PdfName.SUBFILTER);
    
    if (subFilter.Equals(PdfName.ADBE_PKCS7_DETACHED))
    {
        int sigFlags = signatureDict.GetAsNumber(PdfName.SIGFLAGS)?.IntValue ?? 0;
        
        if ((sigFlags & 1) == 0) // Check if validity is unknown
        {
            PdfArray annots = reader.AcroFields.GetFieldItem(signatureName).GetWidgetRef().GetAsArray(PdfName.ANNOTS);
            
            if (annots != null)
            {
                foreach (PdfObject annotObj in annots)
                {
                    PdfDictionary annotDict = (PdfDictionary)PdfReader.GetPdfObject(annotObj);
                    PdfName annotSubtype = annotDict.GetAsName(PdfName.SUBTYPE);
                    
                    if (annotSubtype.Equals(PdfName.WIDGET))
                    {
                        PdfDictionary apDict = annotDict.GetAsDict(PdfName.AP);
                        apDict.Remove(PdfName.N);
                        apDict.Remove(PdfName.DN);
                    }
                }
            }
        }
    }
}
  1. 保存修改后的PDF文件:使用PdfStamper类将修改后的PDF文件保存到磁盘上。
代码语言:txt
复制
PdfStamper stamper = new PdfStamper(reader, new FileStream("path/to/output.pdf", FileMode.Create));
stamper.Close();
reader.Close();

这样,通过以上步骤,你可以使用iTextSharp库和C#从签名字段中删除有效性未知图标。请注意,这只是一个示例,具体的实现可能因PDF文件的结构和内容而有所不同。

关于iTextSharp的更多信息和使用示例,你可以参考腾讯云的iTextSharp产品介绍链接:iTextSharp产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用 iTextSharp VS ComPDFKit 在 C# PDF 中提取文本

对于开发人员来说, PDF 中提取文本是有效数据提取的第一步。你们的一些人可能会担心如何使用 C# PDF 中提取文本。iTextSharp 一直是 PDF 文本提取的有效解决方案。...在本指南中,我们将深入研究如何使用 iTextSharpC# 中进行 PDF 文本提取,涵盖安装和项目设置到提供代码示例的所有内容。...此外,我们将介绍并将其与另一个强大的 C# 库 ComPDFKit 进行比较,以帮助您做出明智的决策。1. 如何使用 ComPDFKit 在 C# PDF 中提取文本?...当未启用 OCR 时, CPDFConverterJsonText 类将返回 与 PDF 页面内容流定义完全相同的文本对象。2. 如何使用 iTextSharp PDF 中提取文本?...按照以下示例使用 iTextSharp C# PDF 文件中提取文本。

9010
  • .NET Core.NET5.NET6 开源项目汇总1:常用必备组件

    请严格遵守每个项目的开源协议后再使用。尊重知识产权,共建和谐开源社区。 以下开源项目(含组件),网络搜集,后期会不断补充。...我们知道,EF Core不支持高效的删除和更新数据,所有的更新和操作都是逐条数据处理。...使用 itextsharp.lgplv2.core 把Html转PDF https://www.cnblogs.com/ping9719/p/12759848.html...段落获取形状。 段落获取图表,并可以修改其类别/值。 图表配置的更多属性,如轴标签位置和系列宽度。 至少比DocX版本提前了两个版本。 订阅包含专业技术支持。...可以自动更新文档字段。 在Word文档插入html/rtf文本(带标记)或html/rtf文档。 克隆列表或表。 添加或修改复选框。 设置图片透明度。 基于引用的超链接创建格式化的超链接。

    4.1K10

    C# 可为空引用类型

    在本文的剩余部分,将逐一介绍这些目标,以及 C# 8.0 如何C# 语言中实现对它们的基本支持。 提供指明应使用空值的语法 首先,需要有语法可区分何时引用类型应为空,何时不应为空。...目前的实际情况是,字符串 text; 会生成 text 引用类型,它不仅允许文本为空,还要求文本应为空,实际上文本在许多情况下(如在字段或数组)都默认为空。...或者,如果应明确使用空值(例如,表示“未知”),请将声明类型更改为可为空,如下所示: string?...流分析其实只检查局部变量和参数的方法主体的为空性,并利用方法和运算符签名来确定有效性。...默认接口实现:使用 C#,可以实现多个接口。这样一来,每个接口的签名都是继承而来。此外,还可以在基类中提供成员实现,这样所有派生类就都有默认成员实现。

    16720

    Visual Studio 调试系列3 断点

    01 在源代码设置断点 可以在任意可执行代码行上设置断点。 例如,在以下 C# 代码,可以设置断点在变量声明for循环中或内的任何代码for循环。 命名空间或类声明或方法签名,无法设置断点。...有关调用堆栈的详细信息,请参阅如何使用调用堆栈窗口。 断点是一个触发器。 您可以单击它,请按F9,或使用调试 > 切换断点删除或重新插入。...或者,在断点设置窗口中,悬停在所需断点,选择设置图标,,然后选择操作。 输入的消息将消息记录到输出窗口字段。...Debugger.Break如何工作的上一个检查中所述的测试,测试以及此问题。 11 删除了断点,但在再次启动调试时继续命中该断点 如果在调试时删除了断点,可能在下一步启动调试的时再次命中该断点。...要停止命中此断点,请确保 “断点” 窗口删除该断点的所有实例。

    5.3K20

    Visual Studio 2017 15.7 下的.NET Core

    在安装过程, "更新" 对话框为您提供了有关update的更多详细信息。 c# 7.3包含在 Visual Studio 版本15.7 。 我们改进了 c# 和 VB 项目的解决方案加载时间。...实时单元测试适用于嵌入式 pdbs , 并支持使用引用程序集的项目。 测试资源管理器在测试运行期间有更多的响应图标。 c++ 开发人员可以使用CodeLens 进行单元测试....当不需要解决方案或项目重新加载时, 我们Git 的分支签出删除了阻止模式对话框。 在Git 中有一个选项可在 OpenSSL 和 SChannel 之间进行选择....可以Visual Studio IDE创建和关联 Azure 密钥库....我们添加了对NuGet 包签名的支持. 我们为6.2 服务结构版本添加了服务结构工具. 我们更新了实体框架工具以使用 EF 6.2 运行时, 并改进了现有数据库的逆向工程。

    3.2K80

    Visual Studio 2017 15.7 下的.NET Core

    在安装过程, "更新" 对话框为您提供了有关update的更多详细信息。 c# 7.3包含在 Visual Studio 版本15.7 。 我们改进了 c# 和 VB 项目的解决方案加载时间。...实时单元测试适用于嵌入式 pdbs , 并支持使用引用程序集的项目。 测试资源管理器在测试运行期间有更多的响应图标。 c++ 开发人员可以使用CodeLens 进行单元测试....当不需要解决方案或项目重新加载时, 我们Git 的分支签出删除了阻止模式对话框。 在Git 中有一个选项可在 OpenSSL 和 SChannel 之间进行选择....可以Visual Studio IDE创建和关联 Azure 密钥库....我们添加了对NuGet 包签名的支持. 我们为6.2 服务结构版本添加了服务结构工具. 我们更新了实体框架工具以使用 EF 6.2 运行时, 并改进了现有数据库的逆向工程。

    3K50

    笔记 | Xamarin

    时,MenItem 就会显示 MenuItem: 浮出控件的菜单项 浮出控件 参考: Xamarin.Forms Shell 浮出控件 - Xamarin | Microsoft Docs 可以通过图标屏幕的一侧轻扫来访问它...但是,可以使用 FlyoutItemIsVisible 属性将项隐藏在浮出控件,并使用 IsVisible 属性将其浮出控件删除: 类型为 bool 的 FlyoutItemIsVisible 指示项是否已隐藏在浮出控件但仍可以通过...HttpClient设置cookies的两种办法 - 小猪39505 - 博客园 如何C# 项目中利用HttpClient实现一个文件上传功能 - 开发技术 - 亿速云 C#-HttpClient模拟登录...使用签名文件,对酷安给的未签名apk ( CoolApkDevVerify_no_sign.apk )签名,生成 签名的 signed.apk jarsigner -verbose -keystore...应用,Xamarin.Android 提供的默认 ProGuard 配置文件足以删除所有(仅)未使用的代码。

    23.9K20

    Protobuf 语言指南(proto3)

    8 } 保留字段 当你在某次更新消息屏蔽或者删除了一个字段的话,未来的使用着可能在他们的更新重用这个标签数字来标记他们自己的字段。...对于C#,编译器会每个.proto文件生成一个.cs文件,其中包含文件描述的每种消息类型的类。 您可以按照所选语言的教程(即将推出的proto3版本)了解有关为每种语言使用API的更多信息。...有关如何enum在应用程序中使用消息的详细信息,请参阅所选语言的生成代码指南。 保留值 如果通过完全删除枚举条目或将其注释掉来更新枚举类型,则未来用户可以在对类型进行自己的更新时重用该数值。...同样,您的新代码创建的消息可以由旧代码解析:旧的二进制文件在解析时只是忽略新字段。有关详细信息,请参阅“ 未知字段”部分 只要在更新的消息类型不再使用字段编号,就可以删除字段。...实现可以提供覆盖此行为的选项,并使用其默认值输出字段。 忽略未知字段:默认情况下,Proto3 JSON解析器应拒绝未知字段,但可以提供忽略解析未知字段的选项。

    5.3K40

    一步步教你在 Windows 上构建 dotnet 系应用的 UOS 软件安装包

    里抄到的 Desktop 文件重点字段的解释 [Desktop Entry]: 必填 desktop文件标识,标准格式,不需要改动。...该字段不存在时,应用属于“其他应用”。 Name: 必填 程序在启动器显示的通用名称,在没有单独设置语言参数的情况下,默认显示该名称。...填写时需要关注路径的有效性,如果路径无效,在安装该程序后,程序快捷方式将不会显示在启动器。...Terminal : 必填 该字段决定程序是否以终端的形式运行,默认为“false”关闭状态,若该项为“true”开启状态,则应用将会在终端打开。....png 格式,无论是后缀名还是图片格式本身,特别是网上下载的图标

    80410

    C#12 新功能盘点 哪个最实用?

    它可以让你使用简单而优雅的语法在任何类和结构创建主构造函数。不再需要样板代码来初始化你的字段和属性。 使用简洁且富有表现力的语法创建数组、跨度和其他集合类型时会感到高兴。...1、集合表达式 在 C# 12 之前,创建集合需要针对不同场景使用不同的语法。初始化所需的与or不同的语法。...初始化成员字段或属性。 在实例成员引用构造函数参数。 删除依赖注入的样板。 3、别名任意类型 别名类型是代码删除复杂类型签名的便捷方法。...using C# 12 开始,其他类型在别名指令中有效。...你可能会像使用任何其他数组一样使用内联数组。有关如何声明内联数组的详细信息,请参阅官网struct类型的语言参考。 结语 本文介绍了C#12的几种新功能,大家觉得实用吗?欢迎留言讨论。

    22710

    gRPC基础--Protobuf编码格式详解

    签名的int值。这些比常规int32更有效地编码负数。 int32 int int32 integer sint64 使用可变长度编码。签名的int值。这些比常规int64更有效地编码负数。...类似的,新代码创建的消息也能由旧版代码解析:旧版消息(二进制)在解析时简单地忽略了新增的字段,查看下面的未知字段章节了解更多。 只要在更新后的消息类型不再重用字段编号,就可以删除字段。...未知字段 未知字段是格式良好的协议缓冲区序列化数据,表示解析器无法识别的字段。例如,当旧二进制文件解析具有新字段的新二进制文件发送的数据时,这些新字段将成为旧二进制文件未知字段。...最初,proto3消息在解析期间总是丢弃未知字段,但在3.5版本,我们重新引入了未知字段的保留以匹配proto2行为。在版本3.5及更高版本未知字段在解析期间保留,并包含在序列化输出。...线路解析或合并时,如果有重复的映射键,则使用最后看到的键。文本格式解析映射时,如果存在重复键,则解析可能会失败。 如果未给映射的字段指定值,字段被序列化时的行为依语言而定。

    5.1K20

    Protobuf语言指南

    签名的int值。这些比常规int32更有效地编码负数。 int32 int int32 integer sint64 使用可变长度编码。签名的int值。这些比常规int64更有效地编码负数。...类似的,新代码创建的消息也能由旧版代码解析:旧版消息(二进制)在解析时简单地忽略了新增的字段,查看下面的未知字段章节了解更多。 只要在更新后的消息类型不再重用字段编号,就可以删除字段。...未知字段 未知字段是格式良好的协议缓冲区序列化数据,表示解析器无法识别的字段。例如,当旧二进制文件解析具有新字段的新二进制文件发送的数据时,这些新字段将成为旧二进制文件未知字段。...最初,proto3消息在解析期间总是丢弃未知字段,但在3.5版本,我们重新引入了未知字段的保留以匹配proto2行为。在版本3.5及更高版本未知字段在解析期间保留,并包含在序列化输出。...线路解析或合并时,如果有重复的映射键,则使用最后看到的键。文本格式解析映射时,如果存在重复键,则解析可能会失败。 如果未给映射的字段指定值,字段被序列化时的行为依语言而定。

    2.1K30

    【干货】C#自定义特性(Attribute)讲解与实际应用

    C#特性 特性(attribute)是被指定给某一声明的一则附加的声明性信息。 特性具有以下属性: 特性可向程序添加元数据。元数据是有关在程序定义的类型的信息。...程序可以使用反射检查自己的元数据或其他程序内的元数据。...特性的用处 我们直接从实战来了解特性意义,针对前两天我们发的一个通讯签名的问题《C#根据类生成签名字符串》和《Android根据类生成签名字符串》,当我们C#后端和Android前端类是一致的时候,根据类型动态生成签名那没有问题...isPrimKey(默认不是):是否是数据库主键 Isidentity(默认不是): 是否是自增长字段 IsDbField(默认是): 是否是数据库字段 ?...这样根据类直接动态生成SQL的插入修改和删除脚本就完成了。 ---- -END-

    6.1K20

    ReSharper 配置及用法

    它的优点包括: 可以所有使用挑选只显示read usage或者write usage,有时我们只是想知道某个变量在哪里被改变了。找到的位置前的图标也告诉你这点。...可以在下方预览,即使我们列出所有使用,也不想跳转到每个使用它的地方,这时预览可以帮你大忙。 当你在代码编辑器改动了某些使用时,比如删除了某行,那么在查找结果的窗体,会用删除线表示出来。...如果需要浏览到某个方法,直接双击它的名字; 如果要把某几个方法装进一个新的region,则可以选中方法,点工具栏上的像框的那个图标;点叉则会删除这个region并把相应的方法移到外面来。...2、对于字段,提供了: Safe Delete,会检测所有使用到的地方,并询问如何删除; Pull Member Up和Push Member Down,可以把这个字段在基类和继承类中移动; Use...3、对于方法,提供了: 与字段类似的功能,此外; Change Signature,更改函数签名,包括更改名称,返回值类型,参数的各种信息,添加和删除参数,相当实用。

    1.8K10

    理解委托类型

    (并不是所有的引用类型都是class) 是一种定义方法签名的类型,可以与具有兼容签名的任何方法关联。 与委托的签名(由返回类型和参数组成)匹配的任何可访问类或结构的任何方法都可以分配给该委托。...可以很明白的看到他真的是一个委托那个公文包一样的小图标就是委托的意思 打开它看看里面有什么 ?...这样) public static delegateLoopChangeEventHandler OnLoopChange; 我是在类里实例化的,所以可以加上修饰符(测试为了直接给main函数使用,...既然事件就是委托,使用方法也是完全一样的,也不重复写了(唯一的区别是“仅可从声明它们的类或结构(发行者类)调用”) 值得注意的是即时被event修饰,如果把当前委托实例传给其他类,在其他类也是可以触发委托...(事件)的,只是不能直接把这个委托当作类的字段使用(触发) 现在再回到前面的EventHandler ,应该很清楚了吧 其实他就是委托类型的数据的声明(存在的意义同样也只是为了方便我们或者说是规范我们

    71000
    领券