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

来源:互联网 发布:网络文明手抄报内容 编辑:程序博客网 时间:2024/06/06 14:05

from http://fanchi.iteye.com/blog/1151000

  1. try {  
  2.       PdfReader reader = null;  
  3.       reader = new PdfReader(domainDoc.getDoc());  
  4.       ByteArrayOutputStream byteOut = new ByteArrayOutputStream();  
  5.       com.itextpdf.text.Document document = new com.itextpdf.text.Document();  
  6.       PdfCopy copy = new PdfCopy(document, byteOut);  
  7.       document.open();  
  8.       int pageNum = reader.getNumberOfPages();  
  9.       pageNum = pageNum - getSignPages(reader);// check sign pages  
  10.       for (int page = 0; page < pageNum;) {  
  11.         copy.addPage(copy.getImportedPage(reader, ++page));  
  12.       }  
  13.       Rectangle pageRectangle = reader.getPageSize(pageNum);  
  14.   
  15.       ByteArrayInputStream signStream =  
  16.           new ByteArrayInputStream(signatureTemplete2PDF(pageRectangle, domainDoc, activities));  
  17.       PdfReader signTempleteReader = new PdfReader(signStream);  
  18.   
  19.       int signPageSize = signTempleteReader.getNumberOfPages();  
  20.   
  21.       for (int page = 0; page < signPageSize;) {  
  22.         copy.addPage(copy.getImportedPage(signTempleteReader, ++page));  
  23.       }  
  24.       document.close();  
  25.   
  26.       // eSign PDF document  
  27.       ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());  
  28.       PdfReader encryptReader = new PdfReader(byteIn);  
  29.       ByteArrayOutputStream encryptByteOut = new ByteArrayOutputStream();  
  30.   
  31.       //   
  32.       String jksPath = Environments.getClassPath(properties.getProperty("store.path"));  
  33.       String keyStorePass = properties.getProperty("store.password");  
  34.       String keyPass = properties.getProperty("key.password");  
  35.       KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());  
  36.       ks.load(new FileInputStream(jksPath), keyStorePass.toCharArray());  
  37.   
  38.       // 获取私钥  
  39.       String alias = (String) ks.aliases().nextElement();  
  40.       PrivateKey key = (PrivateKey) ks.getKey(alias, keyPass.toCharArray());  
  41.       Certificate[] chain = ks.getCertificateChain(alias);  
  42.       PdfStamper stamper = PdfStamper.createSignature(encryptReader, encryptByteOut, '\0');  
  43.   
  44.       // 进行数字签名  
  45.       PdfSignatureAppearance appearance = stamper.getSignatureAppearance();  
  46.       appearance.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);  
  47.       appearance.setCertificationLevel(PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED);  
  48.   
  49.       appearance.setReason("BGL.Digital Signature ");  
  50.       appearance.setLocation("AU");  
  51.   
  52.       stamper.getWriter().setCompressionLevel(5);  
  53.   
  54.       // 使用私钥对文档进行加密,并且只允许打印选项  
  55.       stamper.setEncryption(null, Utils.md5(keyStorePass).getBytes(), PdfWriter.ALLOW_PRINTING,  
  56.           PdfWriter.ENCRYPTION_AES_256);  
  57.       // log.info("status:"+domainDoc.getStatus());  
  58.       // add watermark when signing has been completed by all required signatories.  
  59.       if (domainDoc.getStatus().equals(DocumentStatus.SIGNED)) {  
  60.         // 添加水印  
  61.         addWatermark(stamper, pageRectangle, pageNum, "Digitally Signed on "  
  62.             + Utils.formatDate(new Date()));  
  63.       }  
  64.       // add signature metadata  
  65.       //HashMap<String, String> info = reader.getInfo();  
  66.     //  stamper.setMoreInfo(info);  
  67.   
  68.       stamper.close();  
  69.       InputStream is = new ByteArrayInputStream(encryptByteOut.toByteArray());  
  70.       return is;  
  71.     } catch (DocumentException e) {  
  72.       log.error(e, e);  
  73.       throw new ElectronicSignaturesException(e);  
  74.     } catch (IOException e) {  
  75.       log.error(e, e);  
  76.       throw new ElectronicSignaturesException(e);  
  77.     } catch (Exception e) {  
  78.       log.error(e, e);  
  79.       throw new ElectronicSignaturesException(e);  
  80.     }  

0 0