2013-05-14 76 views
0

我在Java applet中使用PdfStamper来签署pdf文件。 问题在于,当pdfStamper.close()到达时,applet每次都会暂停。 我认为我的问题是相关的一些Java applet的政策,但我已授予的权限都喜欢:在Java Applet中的pdfStampper

grant { 
    permission java.security.AllPermission; 
}; 

我的代码是:

import com.lowagie.text.DocumentException; 
import com.lowagie.text.Rectangle; 
import com.lowagie.text.pdf.PdfReader; 
import com.lowagie.text.pdf.PdfSignatureAppearance; 
import com.lowagie.text.pdf.PdfStamper; 
import java.io.BufferedReader; 
import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.security.AccessController; 
import java.security.KeyStore; 
import java.security.KeyStoreException; 
import java.security.NoSuchAlgorithmException; 
import java.security.PrivateKey; 
import java.security.PrivilegedAction; 
import java.security.UnrecoverableKeyException; 
import java.security.cert.Certificate; 
import java.security.cert.CertificateException; 
import java.util.Enumeration; 
import javax.swing.JApplet; 

public class SignApplet extends JApplet { 

    public void test() { 
     AccessController.doPrivileged(new PrivilegedAction() { 
      @Override 
      public Object run() { 
       try { 
        KeyStore keyStore = KeyStore.getInstance("PKCS11-custom_name"); 

        String pin = "custom_pin"; 
        keyStore.load(null, pin.toCharArray()); 
        Enumeration<String> aliases = keyStore.aliases(); 

        String alias = aliases.nextElement(); 
        PrivateKey key = (PrivateKey) keyStore.getKey(alias, pin.toCharArray()); 
        Certificate[] chain = keyStore.getCertificateChain(alias); 

        String unsigned_pdf = "C:\\Users\\user_name\\unsigned.pdf"; 
        String signed_pdf = "C:\\Users\\user_name\\signed.pdf"; 

        PdfReader pdfReader = new PdfReader((new File(unsigned_pdf)).getAbsolutePath()); 
        File outputFile = new File(signed_pdf); 
        PdfStamper pdfStamper; 
        pdfStamper = PdfStamper.createSignature(pdfReader, null, '\0', outputFile); 
        PdfSignatureAppearance sap = pdfStamper.getSignatureAppearance(); 
        sap.setCrypto(key, chain, null, PdfSignatureAppearance.SELF_SIGNED); 
        sap.setReason("reason"); 
        sap.setLocation(""); 
        sap.setVisibleSignature(new Rectangle(10, 10, 50, 30), 1, null); 

        pdfStamper.setFormFlattening(true); 
        pdfStamper.close(); // -- applet suspends right there 

       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
       return null; 
      } 
     }); 
    } 
} 

我从HTML运行这样的:

<APPLET CODE="SignApplet.class" NAME="SIGNAPPLET" ARCHIVE="SignApplet-1.0.jar, itext-2.1.7.jar" WIDTH="0" HEIGHT="0"></APPLET> 
<h:form> 
    <h:button onclick="document.SIGNAPPLET.test();" value="--- TEST ---" /> 
</h:form> 

密钥库来自USB令牌。

在java调试控制台我没有看到任何异常。 当我从main方法运行相同的源代码(对传递参数进行很少修改)时,它工作得很好。

任何想法是什么问题?

+0

为了更快得到更好的帮助,请发布[SSCCE](http://sscce.org/)。 – 2013-05-14 14:18:10

+0

小程序是否已签名?如果不是,它使用标准安全模型http://docs.oracle.com/javase/6/docs/technotes/guides/plugin/developer_guide/security.html – SJuan76 2013-05-14 14:34:08

+0

Addionally:您正在创建一个过时类型的签名。请阅读http://itextpdf.com/book/digitalsignatures – 2013-05-14 14:41:17

回答

0

解决方案:pdfStamper.close(); // - 小程序在那里暂停

iText PdfStamper正在调用另一个jar bcprov * .jar的API。这个jar文件已经被另一个电子证书签名。您需要解压缩一个jar并删除META-INF中的所有.DSA和.SF文件。然后你再次重新打开它,并使用你的电子证书来提交一个jar文件。它会解决问题。