java操作pdf制作电子签章

电子签章简介

电子签章,与我们所使用的数字证书一样,是用来做为身份验证的一种手段,泛指所有以电子形式存在,依附在电子文件并与其逻辑关联,可用以辨识电子文件签署者身份,保证文件的完整性,并表示签署者同意电子文件所陈述事实的内容。一般来说,对电子签章的认定,都是从技术角度而言的。主要是指通过特定的技术方案来鉴别当事人的身份及确保交易资料内容不被篡改的安全保障措施。从广义上讲,电子签章不仅包括我们通常意义上讲的”非对称性密钥加密”,也包括计算机口令、生物笔迹辨别、指纹识别,以及新近出现的眼虹膜透视辨别法、面纹识别等。而电子签章技术作为目前最成熟的”数字签章”,是以公钥及密钥的”非对称型”密码技术制作的。电子签章是电子签名的一种表现形式,利用图像处理技术将电子签名操作转化为与纸质文件盖章操作相同的可视效果,同时利用电子签名技术保障电子信息的真实性和完整性以及签名人的不可否认性 。

如果对数字证书,签名验签,摘要,数据签名不太理解的同学,可以参考我之前的文章

安全之加密算法(-)

openssl 自建ca,颁发客户端证书

具体了解下

java代码实现

java 操作pdf的开源类库我大概了解了两种pdfbox,itextpdf,两个库各有优势,目前据我使用可知,pdfbox功能较为强大,但是定制性较小,itextpdf 可定制性较高

准备

p12 证书

测试电子签章图片

测试pdf

使用jar包

itextpdf实现电子签章

itextpdf 提供了 MakeSignature 这个入口类,操作相对较为简单

封装下即可 public static void sign(InputStream src //需要签章的pdf文件路径

, OutputStream dest // 签完章的pdf文件路径

, InputStream p12Stream, //p12 路径

char[] password

, String reason //签名的原因,显示在pdf签名属性中,随便填

, String location,String chapterPath) //签名的地点,显示在pdf签名属性中,随便填

throws GeneralSecurityException, IOException, DocumentException {

//读取keystore ,获得私钥和证书链

KeyStore ks = KeyStore.getInstance("PKCS12");

ks.load(p12Stream, password);

String alias = (String)ks.aliases().nextElement();

PrivateKey pk = (PrivateKey) ks.getKey(alias, password);

Certificate[] chain = ks.getCertificateChain(alias);

//下边的步骤都是固定的,照着写就行了,没啥要解释的

// Creating the reader and the stamper,开始pdfreader

PdfReader reader = new PdfReader(src);

//目标文件输出流

//创建签章工具PdfStamper ,最后一个boolean参数

//false的话,pdf文件只允许被签名一次,多次签名,最后一次有效

//true的话,pdf可以被追加签名,验签工具可以识别出每次签名之后文档是否被修改

PdfStamper stamper = PdfStamper.createSignature(reader, dest, '\0', null, false);

// 获取数字签章属性对象,设定数字签章的属性

PdfSignatureAppearance appearance = stamper.getSignatureAppearance();

appearance.setReason(reason);

appearance.setLocation(location);

//设置签名的位置,页码,签名域名称,多次追加签名的时候,签名预名称不能一样

//签名的位置,是图章相对于pdf页面的位置坐标,原点为pdf页面左下角

//四个参数的分别是,图章左下角x,图章左下角y,图章右上角x,图章右上角y

appearance.setVisibleSignature(new Rectangle(0, 800, 100, 700), 1, "sig1");

//读取图章图片,这个image是itext包的image

Image image = Image.getInstance(chapterPath);

appearance.setSignatureGraphic(image);

appearance.setCertificationLevel(PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED);

//设置图章的显示方式,如下选择的是只显示图章(还有其他的模式,可以图章和签名描述一同显示)

appearance.setRenderingMode(RenderingMode.GRAPHIC);

// 这里的itext提供了2个用于签名的接口,可以自己实现,后边着重说这个实现

// 摘要算法

ExternalDigest digest = new BouncyCastleDigest();

// 签名算法

ExternalSignature signature = new PrivateKeySignature(pk, DigestAlgorithms.SHA1, null);

// 调用itext签名方法完成pdf签章CryptoStandard.CMS 签名方式,建议采用这种

MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, CryptoStandard.CMS);

}

pdfbox 实现电子签章 public static void sign(char[] password,InputStream p12Input,FileInputStream imageStream,File srcPdf,File signed,String signerName,String reason,String location) throws Exception{

boolean externalSig=false;

KeyStore keystore = KeyStore.getInstance("PKCS12");

keystore.load(p12Input, password);

PdfSignBox signing = new PdfSignBox(keystore, password);

File signedDocumentFile;

int page=1;

signing.setVisibleSignDesigner(srcPdf.toString(), 50, 100, -90, imageStream, page);

signing.setVisibleSignatureProperties(signerName, location, reason, 0, page, true);

signing.setExternalSigning(externalSig);

signing.signPDF(srcPdf, signed, null);

}

签名测试代码 package com.taoyuan.pdf.sign.test;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import com.taoyuan.pdf.sign.itext.PdfSignBox;

import com.taoyuan.pdf.sign.itext.PdfSignItext;

public class Test {

public static void main(String[] args) throws Exception {

String KEYSTORE="d://test.p12";

char[] PASSWORD = "123".toCharArray();//keystory密码

String SRC="d://demo.pdf" ;//原始pdf

String DEST="d://demo_signed_box.pdf" ;//签名完成的pdf

String DEST2="d://demo_signed_itext.pdf" ;//签名完成的pdf

String chapterPath="d://chapter.png";//签章图片

String signername="測試";

String reason="数据不可更改";

String location="桃源乡";

PdfSignBox.sign(PASSWORD, new FileInputStream(KEYSTORE),

new FileInputStream(chapterPath),

new File(SRC),new File(DEST),signername, reason, location);

PdfSignItext.sign(new FileInputStream(SRC), new FileOutputStream(DEST2),

new FileInputStream(KEYSTORE), PASSWORD,

reason, location, chapterPath);

}

}

签章效果,使用adboe reader打开pdf,查看

当然自己生成的证书去给pdf签章,是不被认可的,这种证书需要花钱的,大概1000多元一年吧

java 电子签章 开源_java操作pdf制作电子签章 - CSDN博客相关推荐

  1. java操作pdf制作电子签章

    #java操作pdf制作电子签章 ##电子签章简介 电子签章,与我们所使用的数字证书一样,是用来做为身份验证的一种手段,泛指所有以电子形式存在,依附在电子文件并与其逻辑关联,可用以辨识电子文件签署者身 ...

  2. oracle表的历史数据转储过程,C#连接Oracle数据库通过存储过程操作数据库 - cuizm的专栏 - CSDN博客...

    C#连接Oracle数据库通过存储过程操作数据库 收藏 此文于2011-06-07被推荐到CSDN首页 此文于2011-06-08被推荐到CSDN首页 如何被推荐? 之前笔者一直用C#连接SQL Se ...

  3. java输出当前时间_JAVA中获取当前系统时间 - Matrix54 - 博客园

    JAVA中获取当前系统时间 - Matrix54 - 博客园 一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleD ...

  4. java支持html5视频流技术Pseudostreaming – Roden的专栏 – CSDN博客

    文章目录[隐藏] java支持html5视频流技术Pseudostreaming 首页博客学院 下载论坛APP 问答商城活动VIP会员专题招聘ITeyeGitChat 图文课 写博客 消息 登录注册 ...

  5. 【C++鼠标键盘操作】自动下载CSDN博客文章到PDF

    思路 这个方法的通用性比较差,用到了一个火狐的插件,这个插件可以将单篇csdn博客保存成pdf,如下图: 整体步骤就是,首先用java爬取我个人博客的所有链接,然后把这些链接复制到txt文档中,如下图 ...

  6. java用正则表达式判断字符串中是否仅包含英文字母、数字和汉字_灵思致远Leansmall的博客-CSDN博客_java判断字符串只包含数字字母

    import java.util.regex.Matcher; import java.util.regex.Pattern;public class StrValidate {// 纯数字priva ...

  7. linux ramdisk 工具,Linux下用Busy Box制作Ramdisk全过程(转帖+部分完善) - 薛正华的专栏 - CSDN博客.pdf...

    Linux下用BusyBox制作Ramdisk全过程(转帖部分完善)-薛正华的专栏-CSDN博客 Linux下用Busy Box制作Ramdisk全过程(转帖+部分完善) 收藏 /software_z ...

  8. 深入理解计算机系统 -资料整理 高清中文版_在所不辞的博客-CSDN博客_深入理解计算机系统第四版pdf

    深入理解计算机系统 -资料整理 高清中文版_在所不辞的博客-CSDN博客_深入理解计算机系统第四版pdf

  9. 【开源】开发者新闻APP+新闻Restful服务+博客园新闻采集程序+infoq新闻采集程序+36kr新闻采集程序+oschina新闻采集程序+51cto新闻采集程序+csdn新闻采集程序...

    这几天车子跟别人撞了,水箱撞稀烂了,要坐一个星期的公车 实在太无聊,就抽时间搞了这么个APP出来,打发公车上的时光 (开发者头条里的新闻专业性太强,公车上实在无法静心研读) 我经常看的也就博客园.in ...

  10. 如何将CSDN博客下载为PDF文件

    嫌前面这段啰嗦可以直接拖到最后看下载方法 听网课的时候看到CSDN上的笔记,觉得记得很好,很详细,想把它保存下来,于是去搜了一下如何将CSDN博客文章导出为PDF,找到了这篇文章:如何将CSDN文章内 ...

最新文章

  1. MIS性能优化常见问题与方案(辅助项目组性能优化的总结贴)
  2. JavaScript页面校验
  3. C++编程思想:指针,引用,拷贝构造函数,赋值运算符
  4. Python学习(变量与字符串)
  5. 2019.08.26关于分页
  6. 在C#中ParameterizedThreadStart和ThreadStart区别
  7. Java-基础类库第一篇认识基础类库
  8. (转)霍华德·马克斯:警惕那些人人都追捧的事物
  9. 计蒜客 第一场 搜狗输入法
  10. shell---字体颜色
  11. 百度SEO标题关键词伪原创组合工具
  12. 数据结构C++ 复旦大学
  13. 联想Y9000P-2022款踩坑指南 加装固态和内存 win10系统安装
  14. win10修改dns服务器命令,win10怎么修改DNS服务器?win10修改DNS服务器的方法
  15. python | 降水数据分析(Ⅰ) 绘制全国降水四季分布图
  16. JavaScript 鼠标移动事件
  17. fortran---说实话,不知道记录有什么用 写着玩吧
  18. 【多媒体编解码】Openmax IL (一)官方文档概述
  19. 痴呆患者血脑屏障(Blood-Brain Barrier, BBB)功能测量
  20. VLAN原理和配置,交换机创建vlan的多种方法、三种接口模式的作用和配置方法、Access、Trunk、Hybrid接口的特性以及配置方法和命令

热门文章

  1. PostgreSQL12.2-CN-v1.0中文手册.chm下载
  2. HDR图像渲染滤镜软件:Topaz Adjust AI for mac
  3. ecshop 二次开发
  4. 8lag加速器无法建立计算机,8LAG 720错误解决办法
  5. PYTHON混淆器 pyobfuscate
  6. window强制删除文件bat
  7. 软件工程—01可行性研究报告
  8. 怀旧服服务器物品栏在哪里,魔兽世界怀旧服:祈福服务器的真实情况,装备不贵,玩家确实不多...
  9. IBM-LTO1,LTO2,LTO3,LTO4,LTO5 LTO6 磁带读写速度和兼容性
  10. leapftp中文版,leapftp中文版的5大主要功能