读书人

iText-对PDF开展数字签名和文档加密

发布时间: 2012-07-24 17:47:58 作者: rapoo

iText-对PDF进行数字签名和文档加密

?

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);    }

读书人网 >PowerDesigner

热点推荐