我想使用pdfbox将多个签名添加到我的pdf中,我尝试使用两个签名,而第二个签名总是变为无效。请咨询, 可以将PDF数字签名数次? Adobe生命周期论坛说是。使用pdfbox的数字签名

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.security.KeyStore;

import java.security.KeyStoreException;

import java.security.NoSuchAlgorithmException;

import java.security.PrivateKey;

import java.security.UnrecoverableKeyException;

import java.security.cert.CertStore;

import java.security.cert.Certificate;

import java.security.cert.CertificateException;

import java.security.cert.CollectionCertStoreParameters;

import java.security.cert.X509Certificate;

import java.util.Arrays;

import java.util.Calendar;

import java.util.Enumeration;

import java.util.List;

import org.apache.pdfbox.exceptions.COSVisitorException;

import org.apache.pdfbox.exceptions.SignatureException;

import org.apache.pdfbox.pdmodel.PDDocument;

import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature;

import org.apache.pdfbox.pdmodel.interactive.digitalsignature.SignatureInterface;

import org.bouncycastle.cms.CMSException;

import org.bouncycastle.cms.CMSProcessable;

import org.bouncycastle.cms.CMSSignedData;

import org.bouncycastle.cms.CMSSignedDataGenerator;

import org.bouncycastle.cms.CMSSignedGenerator;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class SigningTest implements SignatureInterface {

private static BouncyCastleProvider provider = new BouncyCastleProvider();

private PrivateKey privKey;

private Certificate[] cert;

public SigningTest(KeyStore keystore, char[] pin) {

try {

Enumeration aliases = keystore.aliases();

String alias = null;

if (aliases.hasMoreElements())

alias = aliases.nextElement();

else

throw new RuntimeException("Could not find Key");

privKey = (PrivateKey) keystore.getKey(alias, pin);

cert = keystore.getCertificateChain(alias);

} catch (KeyStoreException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (UnrecoverableKeyException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchAlgorithmException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public byte[] sign(InputStream content) throws SignatureException,

IOException {

CMSProcessableInputStream input = new CMSProcessableInputStream(content);

CMSSignedDataGenerator gen = new CMSSignedDataGenerator();

// CertificateChain

List certList = Arrays.asList(cert);

CertStore certStore = null;

try {

certStore = CertStore.getInstance("Collection",

new CollectionCertStoreParameters(certList), provider);

gen.addSigner(privKey, (X509Certificate) certList.get(0),

CMSSignedGenerator.DIGEST_SHA256);

gen.addCertificatesAndCRLs(certStore);

CMSSignedData signedData = gen.generate(input, false, provider);

return signedData.getEncoded();

} catch (Exception e) {

// should be handled

e.printStackTrace();

}

throw new RuntimeException("Problem while preparing signature");

}

public static void main(String[] args) throws KeyStoreException,

NoSuchAlgorithmException, CertificateException,

FileNotFoundException, IOException, COSVisitorException,

SignatureException, Exception {

File document = new File("resources/OCD.pdf");

PDDocument pdDocument = PDDocument.load(document);

addSignature(pdDocument, "resources/j4l_test.p12", "test");

addSignature(pdDocument, "resources/my.p12", "123456");

File outputDocument = new File("resources/signed" + document.getName());

FileInputStream fis = new FileInputStream(document);

FileOutputStream fos = new FileOutputStream(outputDocument);

byte[] buffer = new byte[8 * 1024];

int c;

while ((c = fis.read(buffer)) != -1)

{

fos.write(buffer, 0, c);

}

fis.close();

fis = new FileInputStream(outputDocument);

pdDocument.saveIncremental(fis, fos);

//pdDocument.close();

}

static void addSignature(PDDocument pdDocument, String filePath,String pwd) throws Exception{

File ksFile = new File(filePath);

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

char[] pin = pwd.toCharArray();

keystore.load(new FileInputStream(ksFile), pin);

SigningTest signing = new SigningTest(keystore, pin.clone());

//signing.signPDF(document);

// create signature dictionary

PDSignature signature = new PDSignature();

signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE); // default filter

// subfilter for basic and PAdES Part 2 signatures

signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED);

signature.setName("signer name");

signature.setLocation("signer location");

signature.setReason("reason for signature");

// the signing date, needed for valid signature

signature.setSignDate(Calendar.getInstance());

// SignatureOptions signatureOptions= new SignatureOptions();

// signatureOptions.setVisualSignature();

// register signature dictionary and sign interface

pdDocument.addSignature(signature, signing);

}

}

class CMSProcessableInputStream implements CMSProcessable {

InputStream in;

public CMSProcessableInputStream(InputStream is) {

in = is;

}

public Object getContent() {

return null;

}

public void write(OutputStream out) throws IOException, CMSException {

// read the content only one time

byte[] buffer = new byte[8 * 1024];

int read;

while ((read = in.read(buffer)) != -1) {

out.write(buffer, 0, read);

}

in.close();

}

}

java pdf数字签名_使用pdfbox的数字签名相关推荐

  1. java pdf电子签名_如何使用java在数字签名的pdf中添加空白页?

    沧海一幻觉 要将Joeri的答案放到上下文中,请看Adobe技术白皮书AdobeAcrobat 9数字签名.更改和改进,尤其是它的"允许和不允许的更改"部分.这里是Adobe澄清允 ...

  2. java pdf电子签名_如何使用Java(ItExtAPI)将PDFS合并而不丢失数字签名

    正如其他人已经说过的,签名背后的想法(至少是想法的一个主要部分)是确保文档没有更改.另一方面,合并确实会更改文档.因此,合并将破坏签名. 不过,另一种不同的方法是,将另一个"普通" ...

  3. java pdf 报表_关于Java向PDF模板写入数据,以及java制作pdf报表的问题

    1.关于java向PDF模板写入数据 写的特别全一步一步来就行. (1)首先下载一个pdf编辑工具Adobe Acrobat DC (2)准备一个pdf模板文件(你可以把自己创建一个只有表头没有内容的 ...

  4. java pdf 修改内容_Java PDFBox – 读取和修改带有特殊字符的pdf(变音符号)

    您不能只替换字符串中的文本.我不轻易说.我多年前曾在Acrobat上工作,并在初始版本中使用了文本搜索工具,因此我对文本编码问题有了相当深刻的理解.主要问题是PDF中的每个字符串都以某种方式编码.这是 ...

  5. java pdf 类库_有哪些可以给pdf加水印,java第三方开源类库?

    使用iText ,感觉还是比较简单的 具体代码: /** * * [功能描述:添加图片和文字水印] [功能详细描述:功能详细描述] * @param srcFile 待加水印文件 * @param d ...

  6. Java PDF数字签名(五)—Java 给PDF签名时添加可信时间戳

    一.程序运行环境 编译环境:IntelliJ IDEA 所需测试文件:PDF..pfx数字证书及密钥.PDF Jar包(Free Spire.PDF for Java).签名图片(.png格式) 可信 ...

  7. java压缩pdf大小_如何使用pdfbox或其他java库减小合并的PDF / A-1b文件的大小

    输入:包含嵌入字体的(例如14个)PDF / A-1b文件列表. 处理:与Apache PDFBOX进行简单合并. 结果:1个文件大小(太大)的PDF / A-1b文件. (它几乎是所有源文件大小的总 ...

  8. java使用RSA加密方式,实现数字签名

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用RSA加密方式,实现数字签名.数字签名,使用私钥获取签名,使用公钥校验签名 测试代码 public static void main( ...

  9. java生成pdf方法_详解Java生成PDF文档方法|chu

    最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持iText,生成PDF文档,还支持将XML ...

最新文章

  1. MySQL 5.6通过Keepalived+互为主从实现高可用架构
  2. Java集合7 (NavigableSet)
  3. UE4学习-UE4结合vs2019混合编程
  4. Android冷启动优化解析
  5. python模拟微信登录公众号_python通过手机抓取微信公众号
  6. 使用DiskGenius拓展系统盘C盘的容量
  7. 动作Action详解
  8. 孤独是人成熟的必经之路
  9. 在windows和Ubuntu配置OpenXXX客户端
  10. 【机器学习 - 8】:随机梯度下降法
  11. c++ opencv保存图片
  12. 计算机进制算法在线,二进制转十进制和十六进制在线计算器
  13. 出货量差距大幅缩短,四季度小米可望彻底击败华为!
  14. 【详细七层】OSI 网络模型,七层网络模型
  15. 基于嘉立创双层板E5071C的低成本TRL校准
  16. 异常(The host [tomcat_server] is not valid)(Nginx配置异常)
  17. 如何使用Logitech Harmony遥控器控制智能家居设备
  18. 六大设计原则 (SOLID)
  19. IDEA版本和JDK版本对应关系
  20. 基于遗传算法优化的ISD惯容悬架

热门文章

  1. NLP与推荐系统的比较、联系与未来
  2. Tensorflow2.0学习(五) — Keras基础应用(IMDb电影集情感分析)
  3. NRF52832 + NRF24L01 通讯
  4. delphi 手机号/Email/传真号验证有效性
  5. (在客户端)https抓包解密
  6. dotnetty java netty,DotNetty发送请求的最佳实践
  7. 帝国网站内容管理系统(cms)
  8. Bresenham 算法画直线
  9. Java输出数组内容
  10. ET框架自动引用UI组件