java pdf数字签名_使用pdfbox的数字签名
我想使用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的数字签名相关推荐
- java pdf电子签名_如何使用java在数字签名的pdf中添加空白页?
沧海一幻觉 要将Joeri的答案放到上下文中,请看Adobe技术白皮书AdobeAcrobat 9数字签名.更改和改进,尤其是它的"允许和不允许的更改"部分.这里是Adobe澄清允 ...
- java pdf电子签名_如何使用Java(ItExtAPI)将PDFS合并而不丢失数字签名
正如其他人已经说过的,签名背后的想法(至少是想法的一个主要部分)是确保文档没有更改.另一方面,合并确实会更改文档.因此,合并将破坏签名. 不过,另一种不同的方法是,将另一个"普通" ...
- java pdf 报表_关于Java向PDF模板写入数据,以及java制作pdf报表的问题
1.关于java向PDF模板写入数据 写的特别全一步一步来就行. (1)首先下载一个pdf编辑工具Adobe Acrobat DC (2)准备一个pdf模板文件(你可以把自己创建一个只有表头没有内容的 ...
- java pdf 修改内容_Java PDFBox – 读取和修改带有特殊字符的pdf(变音符号)
您不能只替换字符串中的文本.我不轻易说.我多年前曾在Acrobat上工作,并在初始版本中使用了文本搜索工具,因此我对文本编码问题有了相当深刻的理解.主要问题是PDF中的每个字符串都以某种方式编码.这是 ...
- java pdf 类库_有哪些可以给pdf加水印,java第三方开源类库?
使用iText ,感觉还是比较简单的 具体代码: /** * * [功能描述:添加图片和文字水印] [功能详细描述:功能详细描述] * @param srcFile 待加水印文件 * @param d ...
- Java PDF数字签名(五)—Java 给PDF签名时添加可信时间戳
一.程序运行环境 编译环境:IntelliJ IDEA 所需测试文件:PDF..pfx数字证书及密钥.PDF Jar包(Free Spire.PDF for Java).签名图片(.png格式) 可信 ...
- java压缩pdf大小_如何使用pdfbox或其他java库减小合并的PDF / A-1b文件的大小
输入:包含嵌入字体的(例如14个)PDF / A-1b文件列表. 处理:与Apache PDFBOX进行简单合并. 结果:1个文件大小(太大)的PDF / A-1b文件. (它几乎是所有源文件大小的总 ...
- java使用RSA加密方式,实现数字签名
全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用RSA加密方式,实现数字签名.数字签名,使用私钥获取签名,使用公钥校验签名 测试代码 public static void main( ...
- java生成pdf方法_详解Java生成PDF文档方法|chu
最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持iText,生成PDF文档,还支持将XML ...
最新文章
- MySQL 5.6通过Keepalived+互为主从实现高可用架构
- Java集合7 (NavigableSet)
- UE4学习-UE4结合vs2019混合编程
- Android冷启动优化解析
- python模拟微信登录公众号_python通过手机抓取微信公众号
- 使用DiskGenius拓展系统盘C盘的容量
- 动作Action详解
- 孤独是人成熟的必经之路
- 在windows和Ubuntu配置OpenXXX客户端
- 【机器学习 - 8】:随机梯度下降法
- c++ opencv保存图片
- 计算机进制算法在线,二进制转十进制和十六进制在线计算器
- 出货量差距大幅缩短,四季度小米可望彻底击败华为!
- 【详细七层】OSI 网络模型,七层网络模型
- 基于嘉立创双层板E5071C的低成本TRL校准
- 异常(The host [tomcat_server] is not valid)(Nginx配置异常)
- 如何使用Logitech Harmony遥控器控制智能家居设备
- 六大设计原则 (SOLID)
- IDEA版本和JDK版本对应关系
- 基于遗传算法优化的ISD惯容悬架