`
kong6001
  • 浏览: 139495 次
  • 性别: 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 PDF文档的数字签名说明文档.pdf

    itext官方数字签名白皮书 我只翻译了我用到的一部分 关于数字证书加密的内容 其他的关联内容并没有翻译

    java对PDF签名签章demo

    java使用itext对PDF进行签名签章。包括:java创建PDF文档,java对PDF进行加水印,java对PDF加图片水印。java对PDF进行签章。java读取p12秘钥库中证书对PDF进行签章加密。

    将已有的pdf文档 加密 签名 包含所有jar,亲测可以

    java项目完整代码,将已有的pdf文档 加密 签名 包含所有jar,亲测可以 ,包含注解

    itextpdf:[不推荐]核心Java库+ PDFA,xtra和XML Worker。 仅添加安全修复程序-请使用iText 7

    加密,哈希和数字签名 由几个jar组成。 主要版本包含: itextpdf-xyzjar :核心库 itext-xtra-xyzjar :附加功能(PDF 2!) itext-pdfa-xyzjar :与PDF / A相关的功能 xmlworker-xyzjar :XML(和HTML)功能 ...

    一般公司的java笔试题-Pkcs11Interop.PDF:Pkcs11Interop和iText(iTextSharp)库的集成层

    一般公司的java笔试题Pkcs11Interop.PDF Pkcs11Interop ...文档进行数字签名,在 Pkcs11Interop 和 iTextSharp 库之间创建了一个集成层。 Pkcs11Interop.PDF 库: 使 iTextSharp 能够使用智能卡或任何其他 P

    itextsharp:[已弃用] iText库的.NET端口,仅会添加安全修复程序-请使用iText 7 for .NET

    加密,散列和数字签名 由几个dll组成。 主要版本包含: itextsharp.dll :核心库 itextsharp.xtra.dll :附加功能(PDF 2!) itextsharp.pdfa.dll :PDF / A相关功能 itextsharp.xmlworker.dll :XML(和HTML)...

    java源码包---java 源码 大量 实例

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    java源码包2

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    JAVA上百实例源码以及开源项目源代码

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    java源码包3

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    java源码包4

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    JAVA上百实例源码以及开源项目

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

Global site tag (gtag.js) - Google Analytics