`
kong6001
  • 浏览: 142106 次
  • 性别: Icon_minigender_1
  • 来自: 广东广州
社区版块
存档分类
最新评论

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

    博客分类:
  • 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);
    }
主要的jar版本为
   com.itextpdf:itextpdf:jar:5.1.1
  org.bouncycastle:bcmail-jdk15:jar:1.46
  org.bouncycastle:bcprov-jdk15:jar:1.46


  
  
分享到:
评论
4 楼 jcxdxg 2013-11-28  
代码非常给力,谢谢
3 楼 machunlin 2012-11-05  
我根据你的代码写出来运行报错,请问是什么原因啊?以为是缺少jar包,可我把bcprov-ext-jdk15on-147.jar加进去也不行:
Exception in thread "main" java.lang.NoClassDefFoundError: org/bouncycastle/asn1/DEREncodable
at com.itextpdf.text.pdf.PdfSigGenericPKCS.setSignInfo(Unknown Source)
at com.itextpdf.text.pdf.PdfSignatureAppearance.preClose(Unknown Source)
at com.itextpdf.text.pdf.PdfSignatureAppearance.preClose(Unknown Source)
at com.itextpdf.text.pdf.PdfStamper.close(Unknown Source)
at cn.eseals.sign.SignOnPdf.signDoc(SignOnPdf.java:73)
at cn.eseals.sign.SignOnPdf.main(SignOnPdf.java:86)
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.asn1.DEREncodable
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 6 more
2 楼 kong6001 2012-10-25  
machunlin 写道
我了个去,楼主,你能把完整的代码贴出来吗?你这代码吧,不全,想抛弃不用吧,又不容易找到别的代码。你不是故意整我的吧,哈哈。你要是有完整点的代码,千万帮忙发我邮箱:470904401@qq.com,多谢了。

这段代码已经非常完整了,所有逻辑都包括了.
1 楼 machunlin 2012-10-23  
我了个去,楼主,你能把完整的代码贴出来吗?你这代码吧,不全,想抛弃不用吧,又不容易找到别的代码。你不是故意整我的吧,哈哈。你要是有完整点的代码,千万帮忙发我邮箱:470904401@qq.com,多谢了。

相关推荐

    itext-asian-5.2.0.jar、itextpdf-5.5.5.jar JAR包

    此外,iTextPDF还提供了数字签名、加密和表单处理等功能,以满足各种PDF处理需求。 这两个JAR包结合使用,可以为处理含有亚洲语言的PDF文档提供全面的支持。例如,你可以创建一个包含汉字的PDF报告,或者从一个已经...

    itext-2.1.7.jar和itext-rtf-2.1.7.jar

    6. **数字签名**:iText支持PDF文档的数字签名,确保文档的安全性和完整性。 7. **水印和页眉页脚**:你可以为PDF添加水印、页眉和页脚,增加文档的视觉效果和版权保护。 8. **PDF/A兼容性**:对于长期存储和归档...

    官方最新itextpdf-5.5.8.jar+中文支持包itext-asian.jar

    5. **安全性**:提供数字签名和加密功能,保护PDF文档不被篡改。 6. **事件处理**:通过监听器机制,可以在PDF文档的不同阶段执行自定义操作,如页眉页脚的动态生成。 7. **PDF/A兼容**:支持创建符合PDF/A标准的...

    itext-5.4.2资源包附带pdf加密、pdf水印签名java文件

    iText库支持对PDF文档进行40位和128位的RC4加密,以及AES-128加密。通过使用iText,开发者可以设置用户权限,限制如打印、复制文本、编辑文档等操作。这确保了PDF文件的内容不被未经授权的人员滥用。 接下来是PDF...

    PDF数字签名(ITEXT+keytool)

    2. **ITEXT库**:ITEXT是Java中广泛使用的PDF处理库,能够进行创建、编辑和签名PDF文档等操作。在数字签名方面,ITEXT提供了SignatureUtils和PdfStamper类等工具,用于创建和验证PDF的数字签名。 3. **keytool**:...

    itextpdf-5.5.10 源码、jar包、doc文档

    ITextPDF是一个广泛使用的Java库,用于创建、修改和处理PDF文档。这个资源包包含的是itextpdf的5.5.10版本,它提供了源代码、jar包和文档,对于开发者来说是非常宝贵的参考资料。 首先,我们来详细了解**itextpdf库...

    itext-5.2.0.zip

    首先,`itextpdf-5.2.0.jar`是核心库文件,包含了iText的主要功能,如创建、读取、修改PDF文档,添加文本、图像、表格、链接等元素,以及数字签名和安全性功能。将这个jar文件放入项目的`WEB-INF/lib`目录下,意味着...

    itext生成pdf并通过证书进行签章

    2. **数字签名**:使用证书的私钥对PDF文档的哈希值进行加密,形成数字签名。这样,任何对文档的改动都会导致哈希值变化,从而签名无效。 3. **时间戳**:签章时通常会包含一个时间戳,记录签章时的日期和时间,这...

    itext-5.5.3.zip

    - `itextpdf-5.5.3-javadoc.jar`:包含了iText库的Java文档,是开发者理解和学习库函数的重要参考资料。 - `itextpdf-5.5.3-sources.jar`:源码包,允许开发者查看和研究库的内部实现,有助于深入学习和调试。 - ...

    iText-5.0.2 JAR包

    此外,还可以创建和处理PDF表单,提取和修改文档元数据,甚至进行数字签名和安全加密。 6. 开源许可证:iText遵循AGPL(GNU Affero General Public License)许可证,这意味着任何使用iText的项目,如果涉及到...

    itextpdf-5.5.9.jar和中文支持包itextasian-5.5.9.jar

    此外,iTextPDF还提供了许多高级功能,如PDF/A合规性、PDF/UA无障碍访问、PDF加密等,可以根据具体需求进行深入探索和应用。 总的来说,iTextPDF与itextasian结合使用,为Java开发者提供了一套完整的工具集,用于...

    iText中文帮助文档_itext中文帮助文档_itext_iTextpdf_itext中文文档_

    iText是一款广泛使用的开源Java库,专门用于生成和编辑PDF文档。这个中文帮助文档提供了详细的指导,帮助开发者理解和使用iText来创建包含丰富内容的PDF文件。以下是对iText库和文档中涉及的关键知识点的详细解释: ...

    itextpdf中文帮助文档.pdf

    iTextPDF不仅支持创建新的PDF文档,还能在现有文档上进行编辑,如添加文本、图像、表格、链接等,以及签署PDF和执行数字签名。 文档内容可能包括以下几个关键知识点: 1. **安装与引入**:首先,介绍如何将iText...

    iText PDF加密签名.zip

    本资料包"iText PDF加密签名.zip"主要关注的是如何使用iText库对PDF文档进行加密和签名,以确保文档的完整性和不可篡改性。 PDF加密是保护PDF文档免受未经授权访问的一种方法。iText支持40位和128位RC4加密以及AES...

    itext所应用到的三个重要JAR包

    例如,可以使用iText创建新的PDF文档,添加文本、图像、表格、链接等元素,进行布局管理,处理PDF表单,以及进行PDF文档的安全性和数字签名操作。版本5.0.5是iText的一个稳定版本,提供了许多改进和新特性,使得开发...

    itext-5.3.2.jar

    其次,iText 5.3.2还支持对已有PDF文档进行修改和编辑。你可以添加、删除或更新页面内容,甚至可以处理PDF表单。例如,使用`PdfStamper`类可以在现有PDF上添加水印、签名或者其他元数据。此外,iText的`AcroFields`...

    itext-2.1.7.js3.jar

    5. **数字签名**:iText支持为PDF文档添加数字签名,确保文档的完整性和来源的可靠性。 6. **PDF/A兼容性**:对于长期保存和归档的需求,iText可以创建符合PDF/A标准的文档,这是一种确保PDF文件长期可读性的国际...

    itext-5.4.3

    6. **数字签名**:能为PDF文档添加数字签名,验证文档的完整性和来源。 7. **加密与权限控制**:可以设置PDF文档的访问权限,保护文档内容不被非法复制或编辑。 在5.4.3版本中,提供的资源包括多个JAR文件: - **...

    iText-5.0.6.zip

    5. **数字签名**:iText支持对PDF文档进行数字签名,以确保其完整性和不可篡改性。 6. **PDF/A兼容性**:iText可以创建符合PDF/A标准的文档,这种标准用于长期保存电子文档,保证其在未来仍可阅读。 7. **XML到PDF...

    itext-2.0.8.jar

    5. **数字签名**:为了确保文档的安全性和完整性,iText支持添加数字签名,验证文档未被篡改。 6. **事件处理**:通过实现特定的接口,开发者可以自定义PDF生成过程中的某些行为,比如页面插入、对象创建等。 7. *...

Global site tag (gtag.js) - Google Analytics