首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Applet中的PdfStamper

Java Applet中的PdfStamper
EN

Stack Overflow用户
提问于 2013-05-14 22:07:11
回答 1查看 832关注 0票数 0

我在Java applet中使用PdfStamper来签署pdf文件。问题是当小程序每次到达pdfStamper.close()行时都会挂起;我认为我的问题与某些java小程序策略有关,但我已经将权限授予了所有类似的人:

代码语言:javascript
复制
grant {
  permission java.security.AllPermission;
};

我的代码是:

代码语言:javascript
复制
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运行它,就像这样:

代码语言:javascript
复制
<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方法运行相同的源代码时(对于传递参数稍作修改),它工作得非常好。

你知道问题出在哪里吗?

EN

回答 1

Stack Overflow用户

发布于 2014-11-06 16:42:27

解决方案: pdfStamper.close();// --小程序立即挂起

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16545402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档