java操作pdf制作电子签章 - CSDN博客

标签: | 发表时间:2017-11-28 09:21 | 作者:
出处:http://blog.csdn.net

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 实现电子签章

pdfbox 实现签名可以从pdfbox 官网示例中找到
svn地址
https://svn.apache.org/repos/asf/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/
简单封装示例

  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多元一年吧

完整代码下载地址
http://download.csdn.net/download/do_bset_yourself/10010394

相关 [java pdf 制作] 推荐:

java合并PDF

- - Java - 编程语言 - ITeye博客
15.         * * 合並pdf文件 * * @param files 要合並文件數組(絕對路徑如{ "e:\\1.pdf", "e:\\2.pdf" ,. 17.         * 合並後新產生的文件絕對路徑如e:\\temp.pdf,請自己刪除用過後不再用的文件請 * @return boolean.

java操作pdf制作电子签章 - CSDN博客

- -
java操作pdf制作电子签章. 电子签章,与我们所使用的数字证书一样,是用来做为身份验证的一种手段,泛指所有以电子形式存在,依附在电子文件并与其逻辑关联,可用以辨识电子文件签署者身份,保证文件的完整性,并表示签署者同意电子文件所陈述事实的内容. 一般来说,对电子签章的认定,都是从技术角度而言的. 主要是指通过特定的技术方案来鉴别当事人的身份及确保交易资料内容不被篡改的安全保障措施.

Java iText使用PDF模板生成PDF文档

- - CSDN博客综合推荐文章
我们系统需要生成一个可以打印的PDF文档,老板给了我一个Word文档,按照这个Word文档的格式生成PDF文档. 第一步:下载AdobeAcrobat DC,必须使用这个来制作from域. 第二步:使用AdobeAcrobat DC将Word导成PDF文档. 第三步:由于还要加水印的效果,所以还是使用AdobeAcrobat DC来添加水印,非常方便;.

iText 5.4.0 发布,Java 的 PDF 开发包

- - 开源中国社区最新新闻
iText 5.4.0 除了修复很多 bug 之外,主要是侧重于创建结构化的 PDF 文档,当使用 Document, Paragraph, PdfPTable 创建 PDF 时可自动进行标识,标识的 PDF 是更好支持 PDF/UA 和 PDF/A 兼容性的第一步. iText是一个非常著名的能够快速产生PDF文件的Java类库.

将PPT转化为PDF我的JAVA代码实现!

- - CSDN博客推荐文章
jacob的方法,足可以解决这个问题,但是我既然以前曾经做过报表,就想尝试不同的方法. JACOB是一座连接JAVA和微软的桥,所有的解析由微软解析. POI是没有微软解析的那么原汁原味的,所以如果要求高的话,还是使用JACOB. 大致思路很简单,将PPT先转化为图片,然后将图片写入PDF. 转化图片是用POI,操作PDF使用ITEX.

Java实现HTML页面转PDF解决方案

- - Java - 编程语言 - ITeye博客
首先,当然是找到能够解析PDF的完美组件,. 而目前开源的组件中,Itext的确是一个First Choice,如果各位单纯是做把图片转成PDF或者自己写了Velocity或者FreeMarker模板生成了HTML是非常推荐直接用Itext来进行的. 而如果,大家像我这样已经有前人写好了HTML页面或者懒得写FreeMarker模板的话.

Java实现HTML代码生成PDF文档

- - 企业架构 - ITeye博客
1、IText实现html2pdf,速度快,纠错能力差,支持中文(要求HTML使用unicode编码),但中支持一种中文字体,开源. 2、Flying Sauser实现html2pdf,纠错能力差,支持多种中文字体(部分样式不能识别),开源. 3、PD4ML实现html2pdf,速度快,纠错能力强,支持多种中文字体,商业.

使用Java将PDF文件转成图片

- - 编程语言 - ITeye博客
使用Java将PDF文件转成图片. System.out.println("页数: " + pdffile.getNumPages());. //目录不存在,则创建目录. FileOutputStream out = new FileOutputStream( getPdfFilePath+File.separator + i + ".jpg"); // 输出到文件流.

Apache FOP 将Java对象转换为pdf文件

- - 开源软件 - ITeye博客
最近因为项目需要将对象打印特定模式的PDF,经大佬建议,选择了使用FOP,较之iText,灵活性更强,对代码依赖更少. 下面简要说明一下如何使用及demo.     根据现有一个pdf模板,将值填入pdf中导出. 其中,值从Java一个List>获取,每个Map展示在一页pdf中,整个List生成为一个pdf文件.

《10类航模飞机制作》扫描版[PDF]

- suchasplus - SimpleCD - 最新电驴资源
摘要信息:图书分类: 科技出版社: 科学普及出版社发行时间: 1988年3月语言: 简体中文. 内容简介: 本书介绍了广大航模爱好者喜爱的手掷模型、弹射模型、橡筋动力模型、牵引模型滑翔机.....十类中的优秀,模型飞机制作丛书,爱好航模的好帮手.