try {
PdfReader reader = null;
reader = new PdfReader(domainDoc.getDoc());
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
com.itextpdf.text.Document document = new com.itextpdf.text.Document();
PdfCopy copy = new PdfCopy(document, byteOut);
document.open();
int pageNum = reader.getNumberOfPages();
pageNum = pageNum - getSignPages(reader);// check sign pages
for (int page = 0; page < pageNum;) {
copy.addPage(copy.getImportedPage(reader, ++page));
}
Rectangle pageRectangle = reader.getPageSize(pageNum);
ByteArrayInputStream signStream =
new ByteArrayInputStream(signatureTemplete2PDF(pageRectangle, domainDoc, activities));
PdfReader signTempleteReader = new PdfReader(signStream);
int signPageSize = signTempleteReader.getNumberOfPages();
for (int page = 0; page < signPageSize;) {
copy.addPage(copy.getImportedPage(signTempleteReader, ++page));
}
document.close();
// eSign PDF document
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
PdfReader encryptReader = new PdfReader(byteIn);
ByteArrayOutputStream encryptByteOut = new ByteArrayOutputStream();
//
String jksPath = Environments.getClassPath(properties.getProperty("store.path"));
String keyStorePass = properties.getProperty("store.password");
String keyPass = properties.getProperty("key.password");
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(new FileInputStream(jksPath), keyStorePass.toCharArray());
// 获取私钥
String alias = (String) ks.aliases().nextElement();
PrivateKey key = (PrivateKey) ks.getKey(alias, keyPass.toCharArray());
Certificate[] chain = ks.getCertificateChain(alias);
PdfStamper stamper = PdfStamper.createSignature(encryptReader, encryptByteOut, '\0');
// 进行数字签名
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
appearance.setCertificationLevel(PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED);
appearance.setReason("BGL.Digital Signature ");
appearance.setLocation("AU");
stamper.getWriter().setCompressionLevel(5);
// 使用私钥对文档进行加密,并且只允许打印选项
stamper.setEncryption(null, Utils.md5(keyStorePass).getBytes(), PdfWriter.ALLOW_PRINTING,
PdfWriter.ENCRYPTION_AES_256);
// log.info("status:"+domainDoc.getStatus());
// add watermark when signing has been completed by all required signatories.
if (domainDoc.getStatus().equals(DocumentStatus.SIGNED)) {
// 添加水印
addWatermark(stamper, pageRectangle, pageNum, "Digitally Signed on "
+ Utils.formatDate(new Date()));
}
// add signature metadata
//HashMap<String, String> info = reader.getInfo();
// stamper.setMoreInfo(info);
stamper.close();
InputStream is = new ByteArrayInputStream(encryptByteOut.toByteArray());
return is;
} catch (DocumentException e) {
log.error(e, e);
throw new ElectronicSignaturesException(e);
} catch (IOException e) {
log.error(e, e);
throw new ElectronicSignaturesException(e);
} catch (Exception e) {
log.error(e, e);
throw new ElectronicSignaturesException(e);
}
主要的jar版本为
com.itextpdf:itextpdf:jar:5.1.1
org.bouncycastle:bcmail-jdk15:jar:1.46
org.bouncycastle:bcprov-jdk15:jar:1.46
分享到:
相关推荐
itext官方数字签名白皮书 我只翻译了我用到的一部分 关于数字证书加密的内容 其他的关联内容并没有翻译
java使用itext对PDF进行签名签章。包括:java创建PDF文档,java对PDF进行加水印,java对PDF加图片水印。java对PDF进行签章。java读取p12秘钥库中证书对PDF进行签章加密。
java项目完整代码,将已有的pdf文档 加密 签名 包含所有jar,亲测可以 ,包含注解
加密,哈希和数字签名 由几个jar组成。 主要版本包含: itextpdf-xyzjar :核心库 itext-xtra-xyzjar :附加功能(PDF 2!) itext-pdfa-xyzjar :与PDF / A相关的功能 xmlworker-xyzjar :XML(和HTML)功能 ...
一般公司的java笔试题Pkcs11Interop.PDF Pkcs11Interop ...文档进行数字签名,在 Pkcs11Interop 和 iTextSharp 库之间创建了一个集成层。 Pkcs11Interop.PDF 库: 使 iTextSharp 能够使用智能卡或任何其他 P
加密,散列和数字签名 由几个dll组成。 主要版本包含: itextsharp.dll :核心库 itextsharp.xtra.dll :附加功能(PDF 2!) itextsharp.pdfa.dll :PDF / A相关功能 itextsharp.xmlworker.dll :XML(和HTML)...
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...