- 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);
- }
- http://fanchi.iteye.com/blog/1151000