使用iText对PDF文件签章和验章
PDF是国际板式文件标准,使用的范围很广。OFD为国产板式文件标准,设计起点很高,天然支持国产签名算法(SM2、SM3);具有后发优势,目前市场占有率仍然很低,前途光明而又漫长。PDF标准并不支持国产签名算法;但是,可以通过扩展达到支持的目的。PDF、OFD两者签名处理逻辑差异很大,关于ofd签名可以参见我写的其他文章。今天主要介绍通过itext,用国产签名算法实现对pdf的签名。
签名相关的两个概念:签名的保护范围和签名值。签名的保护范围确定了pdf中哪些内容不能更改,如果被更改验证就不同过。签名值:对保护范围的数据做哈希运算后,再用私钥签名生成的一段数据。
对已签名的pdf文件剖析



通过上图,就能大概明白:签名后,文件哪些数据做了修改。
采用itext实现签名

由于pdf不支持国产签名算法,必须通过接口回调的方式实现签名。首先要实现接口IExternalSignatureContainer。
我们的主要工作就是实现该接口,其他工作itext帮我们完成了。
采用itext实现验签
实现验签就必须获取签名的保护范围和签名值。看pdf内部结构:

下面的代码就是获取这两个值:

通过itext获取这两个值并不难,后期如何验证签名就完全取决于我们。
后记:从上面分析可以看出,pdf是可以支持国产加密算法的;由于国产加密算法不是pdf标准的一部分,阅读器对国产加密算法支持不是很好。ofd恰好弥补了pdf的不足,希望ofd的使用范围越来越广,在数字化建设中占有一席之地。
使用iText对PDF文件签章和验章的更多相关文章
- C#:IText构造PDF文件
IText构造PDF文件 1.1 生成Document Document是我们要生成的PDF文件所有元素的容器,因此要生成一个PDF文档,必须首先定义一个Document对象. Document有三种 ...
- Java Itext 生成PDF文件
利用Java Itext生成PDF文件并导出,实现效果如下: PDFUtil.java package com.jeeplus.modules.order.util; import java.io.O ...
- 【Java】使用iText生成PDF文件
iText介绍 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转 ...
- Itext生成pdf文件
来源:https://my.oschina.net/lujianing/blog/894365 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等. ...
- 关于java poi itext生成pdf文件的例子以及方法
最近正在做导出pdf文件的功能,所以查了了一些相关资料,发现不是很完善,这里做一些小小的感想,欢迎各位“猿”童鞋批评指正. poi+itext,所需要的jar包有itext-2.1.7.jar,poi ...
- itext 生成pdf文件添加页眉页脚
原文来自:https://www.cnblogs.com/joann/p/5511905.html 我只是记录所有jar版本,由于版本冲突及不兼容很让人头疼的,一共需要5个jar, 其中itextpd ...
- 使用iText生成pdf文件
前言 折腾了一早上的iText,下面主要介绍一下如何使用iText通过java代码生成pdf文档,以及如何输出包含中文的pdf文档. 首先,要说明的是,我用的是iText-7(java),下载链接是: ...
- itext操作PDF文件添加水印
功能描述:添加图片和文字水印 /** * * [功能描述:添加图片和文字水印] [功能详细描述:功能详细描述] * @param srcFile 待加水印文件 * @param destFile 加水 ...
- C# Parsing 类实现的 PDF 文件分析器
下载示例 下载源代码 1. 介绍 这个项目让你可以去读取并解析一个PDF文件,并将其内部结构展示出来. PDF文件的格式标准文档可以从Adobe那儿获取到. 这个项目基于“PDF指南,第六版,Adob ...
- 使用iText库创建PDF文件
前言 译文连接:http://howtodoinjava.com/apache-commons/create-pdf-files-in-java-itext-tutorial/ 对于excel文件的读 ...
随机推荐
- python 爬虫如何爬取动态生成的网页内容
--- 好的方法很多,我们先掌握一种 --- [背景] 对于网页信息的采集,静态页面我们通常都可以通过python的request.get()库就能获取到整个页面的信息. 但是对于动态生成的网页信 ...
- nextjs 实战开发1 Mercury 二级域名分发系统| 曲速引擎 Warp Drive
开发目标 开发一个免费的二级域名分发系统 创建项目 root@ubuntu:~/dev-nextjs/mercury_frontend# pnpm create next-app@latest .版本 ...
- composer 基础操作
一.composer入门 1.每次安装新的包文件,会更新/vendor/autoload.php文件 2.composer.lock与composer.json的关系 文件composer.lock会 ...
- 强化学习训练过程中的过度拟合(overfitting)
相关: A.I. Learns to Drive From Scratch in Trackmania 本文讨论的是强化学习中的过度拟合问题,要知道强化学习中的过拟合和其他的监督.无监督学习的过拟合不 ...
- 解决Delphi应用程序向桌面资源管理拖放问题 win10,winxp,win2003测试成功
解决Delphi应用程序向桌面资源管理拖放问题 win10,winxp,win2003测试成功 如果是实体拖动,是比较好解决的. 如果是虚拟应用程序数据,拖动到本机桌面或资源管理器目录下,获取目录路径 ...
- Python脚本消费多个Kafka topic
在Python中消费多个Kafka topic,可以使用kafka-python库,这是一个流行的Kafka客户端库.以下是一个详细的代码示例,展示如何创建一个Kafka消费者,并同时消费多个Kafk ...
- Java中的对象池模式
Java中的对象池模式 Java对象的生命周期分析: Java对象的生命周期大致包括三个阶段: 对象的创建,对象的使用, 对象的清除. 因此,对象的生命周期长度可用如下的表达式表示: T = T1 + ...
- 一个包含了 50+ C#/.NET编程技巧实战练习教程
DotNetExercises介绍 DotNetGuide专栏C#/.NET/.NET Core编程技巧练习集:C#/.NET/.NET Core编程常用语法.算法.技巧.中间件.类库.工作业务实操练 ...
- Blazor 组件库 BootstrapBlazor 中Modal组件介绍
组件说明 Model组件是一个模态框组件,可以弹出一个对话框,适合需要定制性更大的场景. 它的样子如下: 其html代码为: <div class="modal-content&quo ...
- canvas实例:绚丽小球
1.思路分析 监听页面尺寸变化(防抖),动态设置canvas大小 监听鼠标移动事件(节流),动态创建小球,小球包含大小,原点坐标,移动方向等信息,其内部方法支持移动和缩小 开启定时器,更新画布内容(清 ...