您的位置:首页 > 其它

通过itext对PDF嵌入数字证书

2017-01-09 10:33 197 查看
摘要: 通过itext对PDF嵌入数字证书,支持对多数字证书的嵌入

itext从原先的1.*版本到了现在的7.*版本,发生了很大的变化,命名方式变了,API的调用方式也变了,网上很多对PDF做数字证书都是通过比较老的版本进行处理的。

###1、新老版本区别简要介绍(话说很多人不知道如何区别)
新老版本最直接的区别就是包命名方式,itext5之前的命名方式为com.lowagie.text,从itext5以后,命名方式改为com.itextpdf.text,通过这个方式最容易判断。



可以直接的看出itext的两个命名方式,咦( ′◔ ‸◔`) 老版本竟然还有那么多人在使用~~~

itext5之前的版本



itex- t5之后的版本



###2、itext对第三方构建的依赖
通过itext对pdf做数字证书时候,需要用到第三方的加解密工具包,以itext5.5.5为例,查看其用到的org.bouncycastle(著名的加密码工具)包的版本。



###3、代码样例

/*pom配置文件*/
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.5</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.54</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.54</version>
</dependency>

public static void makeSignature(String src, String dest) {
BouncyCastleProvider provider = new BouncyCastleProvider();
Security.addProvider(provider);
KeyStore ks = null;
String alias = null;
PrivateKey pk = null;
Certificate[] chain = null;
try {
ks = KeyStore.getInstance("pkcs12");
ks.load(new FileInputStream(KEYSTORE), PASSWORD.toCharArray());
} catch (Exception e) {
e.printStackTrace();
}
try {
alias = (String)ks.aliases().nextElement();
pk = (PrivateKey) ks.getKey(alias, PASSWORD.toCharArray());
chain = ks.getCertificateChain(alias);
} catch (Exception e) {
e.printStackTrace();
}
try {
PdfReader reader = new PdfReader(src);
FileOutputStream os = new FileOutputStream(dest);
PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
//PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0', null, true);
//在一份PDF文档中嵌入多个数字证书请参考上面一行注释的代码
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
appearance.setLayer2Font(new Font(bfChinese, 8, Font.NORMAL));
appearance.setLayer2Text("\n\n\n   浙 江 X X X X 科 技 有 限 公 司");
appearance.setReason("签名防伪");
appearance.setLocation("浙江杭州");  //添加位置信息,可为空
appearance.setContact("service@yunhetong.net");
appearance.setVisibleSignature(new Rectangle(380, 755, 512, 812), reader.getNumberOfPages(), "sig");
ExternalDigest digest = new BouncyCastleDigest();
ExternalSignature signature = new PrivateKeySignature(pk, DigestAlgorithms.SHA256, provider.getName());
MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, MakeSignature.CryptoStandard.CMS);
} catch (Exception e) {
e.printStackTrace();
}
}

这个也是参考官方样例代码进行修改的~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息