java pdf多签名
来源:互联网 发布:校园网络组建方案设计 编辑:程序博客网 时间:2024/06/05 19:30
public static final String KEYSTORE = "d:/zsqz/test.pfx";
public static final char[] PASSWORD = "123456".toCharArray();// keystory密码
public static final String SRC = "d:/zsqz/1.pdf";
public static final String DEST = "d:/zsqz/2.pdf";
public static void main(String[] args) {
try {
// 读取keystore ,获得私钥和证书链
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(new FileInputStream(KEYSTORE), PASSWORD);
String alias = (String) ks.aliases().nextElement();
PrivateKey pk = (PrivateKey) ks.getKey(alias, PASSWORD);
Certificate[] chain = ks.getCertificateChain(alias);
// new一个上边自定义的方法对象,调用签名方法
ITextSignTest app = new ITextSignTest();
Rectangle r1 = new Rectangle(200,200,300,300);
Rectangle r2 = new Rectangle(300,300,400,400);
Rectangle r3 = new Rectangle(100,100,200,200);
// app.sign(SRC, String.format(DEST, 1), chain, pk,
// DigestAlgorithms.SHA1, provider.getName(), CryptoStandard.CMS,
// "Test 1", "Ghent");
// app.sign(SRC, String.format(DEST, 2), chain, pk, "SM3",
// provider.getName(), CryptoStandard.CADES, "Test 2", "Ghent");
app.sign(SRC, String.format(DEST, 3), chain, pk, DigestAlgorithms.SHA1, null, CryptoStandard.CMS, "Test 1",
"Ghent",r1,"sig1");
app.sign("d:/zsqz/2.pdf", "d:/zsqz/3.pdf", chain, pk, DigestAlgorithms.SHA1, null, CryptoStandard.CMS, "Test 2",
"Ghent",r2,"sig2");
app.sign("d:/zsqz/3.pdf", "d:/zsqz/4.pdf", chain, pk, DigestAlgorithms.SHA1, null, CryptoStandard.CMS, "Test 3",
"Ghent",r3,"sig3");
// app.sign(SRC, String.format(DEST, 4), chain, pk,
// DigestAlgorithms.RIPEMD160, provider.getName(),
// CryptoStandard.CADES, "Test 4", "Ghent");
} catch (Exception e) {
// TODO Auto-generated catch block
JOptionPane.showMessageDialog(null, e.getMessage());
e.printStackTrace();
}
}
public void sign(String src // 需要签章的pdf文件路径
, String dest // 签完章的pdf文件路径
, Certificate[] chain // 证书链
, PrivateKey pk // 签名私钥
, String digestAlgorithm // 摘要算法名称,例如SHA-1
, String provider // 密钥算法提供者,可以为null
, CryptoStandard subfilter // 数字签名格式,itext有2种
, String reason // 签名的原因,显示在pdf签名属性中,随便填
, String location,Rectangle r,String sig) // 签名的地点,显示在pdf签名属性中,随便填
throws GeneralSecurityException, IOException, DocumentException {
// 下边的步骤都是固定的,照着写就行了,没啥要解释的
// Creating the reader and the stamper,开始pdfreader
PdfReader reader = new PdfReader(src);
// 目标文件输出流
FileOutputStream os = new FileOutputStream(dest);
// 创建签章工具PdfStamper ,最后一个boolean参数
// false的话,pdf文件只允许被签名一次,多次签名,最后一次有效
// true的话,pdf可以被追加签名,验签工具可以识别出每次签名之后文档是否被修改
PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0', null, true);
// 获取数字签章属性对象,设定数字签章的属性
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setReason(reason);
appearance.setLocation(location);
// 设置签名的位置,页码,签名域名称,多次追加签名的时候,签名预名称不能一样
// 签名的位置,是图章相对于pdf页面的位置坐标,原点为pdf页面左下角
// 四个参数的分别是,图章左下角x,图章左下角y,图章右上角x,图章右上角y
appearance.setVisibleSignature(r, 1, sig);
// 读取图章图片,这个image是itext包的image
Image image = Image.getInstance("d:/zsqz/4-2.png");
appearance.setSignatureGraphic(image);
appearance.setCertificationLevel(PdfSignatureAppearance.NOT_CERTIFIED);
// 设置图章的显示方式,如下选择的是只显示图章(还有其他的模式,可以图章和签名描述一同显示)
appearance.setRenderingMode(RenderingMode.GRAPHIC);
// 这里的itext提供了2个用于签名的接口,可以自己实现,后边着重说这个实现
// 摘要算法
ExternalDigest digest = new BouncyCastleDigest();
// 签名算法
ExternalSignature signature = new PrivateKeySignature(pk, digestAlgorithm, null);
// 调用itext签名方法完成pdf签章
MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, subfilter);
}
public static final char[] PASSWORD = "123456".toCharArray();// keystory密码
public static final String SRC = "d:/zsqz/1.pdf";
public static final String DEST = "d:/zsqz/2.pdf";
public static void main(String[] args) {
try {
// 读取keystore ,获得私钥和证书链
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(new FileInputStream(KEYSTORE), PASSWORD);
String alias = (String) ks.aliases().nextElement();
PrivateKey pk = (PrivateKey) ks.getKey(alias, PASSWORD);
Certificate[] chain = ks.getCertificateChain(alias);
// new一个上边自定义的方法对象,调用签名方法
ITextSignTest app = new ITextSignTest();
Rectangle r1 = new Rectangle(200,200,300,300);
Rectangle r2 = new Rectangle(300,300,400,400);
Rectangle r3 = new Rectangle(100,100,200,200);
// app.sign(SRC, String.format(DEST, 1), chain, pk,
// DigestAlgorithms.SHA1, provider.getName(), CryptoStandard.CMS,
// "Test 1", "Ghent");
// app.sign(SRC, String.format(DEST, 2), chain, pk, "SM3",
// provider.getName(), CryptoStandard.CADES, "Test 2", "Ghent");
app.sign(SRC, String.format(DEST, 3), chain, pk, DigestAlgorithms.SHA1, null, CryptoStandard.CMS, "Test 1",
"Ghent",r1,"sig1");
app.sign("d:/zsqz/2.pdf", "d:/zsqz/3.pdf", chain, pk, DigestAlgorithms.SHA1, null, CryptoStandard.CMS, "Test 2",
"Ghent",r2,"sig2");
app.sign("d:/zsqz/3.pdf", "d:/zsqz/4.pdf", chain, pk, DigestAlgorithms.SHA1, null, CryptoStandard.CMS, "Test 3",
"Ghent",r3,"sig3");
// app.sign(SRC, String.format(DEST, 4), chain, pk,
// DigestAlgorithms.RIPEMD160, provider.getName(),
// CryptoStandard.CADES, "Test 4", "Ghent");
} catch (Exception e) {
// TODO Auto-generated catch block
JOptionPane.showMessageDialog(null, e.getMessage());
e.printStackTrace();
}
}
public void sign(String src // 需要签章的pdf文件路径
, String dest // 签完章的pdf文件路径
, Certificate[] chain // 证书链
, PrivateKey pk // 签名私钥
, String digestAlgorithm // 摘要算法名称,例如SHA-1
, String provider // 密钥算法提供者,可以为null
, CryptoStandard subfilter // 数字签名格式,itext有2种
, String reason // 签名的原因,显示在pdf签名属性中,随便填
, String location,Rectangle r,String sig) // 签名的地点,显示在pdf签名属性中,随便填
throws GeneralSecurityException, IOException, DocumentException {
// 下边的步骤都是固定的,照着写就行了,没啥要解释的
// Creating the reader and the stamper,开始pdfreader
PdfReader reader = new PdfReader(src);
// 目标文件输出流
FileOutputStream os = new FileOutputStream(dest);
// 创建签章工具PdfStamper ,最后一个boolean参数
// false的话,pdf文件只允许被签名一次,多次签名,最后一次有效
// true的话,pdf可以被追加签名,验签工具可以识别出每次签名之后文档是否被修改
PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0', null, true);
// 获取数字签章属性对象,设定数字签章的属性
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setReason(reason);
appearance.setLocation(location);
// 设置签名的位置,页码,签名域名称,多次追加签名的时候,签名预名称不能一样
// 签名的位置,是图章相对于pdf页面的位置坐标,原点为pdf页面左下角
// 四个参数的分别是,图章左下角x,图章左下角y,图章右上角x,图章右上角y
appearance.setVisibleSignature(r, 1, sig);
// 读取图章图片,这个image是itext包的image
Image image = Image.getInstance("d:/zsqz/4-2.png");
appearance.setSignatureGraphic(image);
appearance.setCertificationLevel(PdfSignatureAppearance.NOT_CERTIFIED);
// 设置图章的显示方式,如下选择的是只显示图章(还有其他的模式,可以图章和签名描述一同显示)
appearance.setRenderingMode(RenderingMode.GRAPHIC);
// 这里的itext提供了2个用于签名的接口,可以自己实现,后边着重说这个实现
// 摘要算法
ExternalDigest digest = new BouncyCastleDigest();
// 签名算法
ExternalSignature signature = new PrivateKeySignature(pk, digestAlgorithm, null);
// 调用itext签名方法完成pdf签章
MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, subfilter);
}
阅读全文
0 0
- java pdf多签名
- PDF电子签名分析
- PDF电子签名分析
- pdf上加签名
- java多个pdf合成一个pdf
- 在pdf中增加签名
- java 签名
- C# 给PDF文件添加空白签名域/签名框
- 利用iTextSharp对PDF进行签名
- iText5.4.2 pdf加密、水印签名
- 利用iTextSharp对PDF进行签名
- PDF文档如何添加图片签名
- PDF文档如何添加图片签名
- Java Applet签名验证
- JAVA APPLET签名
- Java Applets签名
- Java Applet签名验证
- java代码签名
- JAVA使用poi进行EXCEL模板导入导出,XSSFCell数据类型
- 微信小程序开发经验总结(六)
- 17. Letter Combinations of a Phone Number(根据手机按键求字母的组合)
- Java笔记之泛型方法
- Servlet笔记——(2.1)Servlet简介
- java pdf多签名
- Unity ImageEfffect 摄像头画面镜像处理
- python之Numpy的使用
- centos安装java
- 【技术贴收集】 .Net core学习笔记教程
- Vue新手环境搭建
- 题目242-计算球体积
- [Linux/Ubuntu] vi/vim 使用方法讲解
- Javaweb项目图片上传实现预览