Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java小程序中的PdfStamper_Java_Applet_Itext_Pdfstamper - Fatal编程技术网

Java小程序中的PdfStamper

Java小程序中的PdfStamper,java,applet,itext,pdfstamper,Java,Applet,Itext,Pdfstamper,我在Javaapplet中使用PdfStamper对pdf文件进行签名。 问题是,每次使用pdfStamper.close()到达行时,applet都会挂起; 我认为我的问题与某些java小程序策略有关,但我已向所有人授予权限,如: grant { permission java.security.AllPermission; }; 我的代码是: import com.lowagie.text.DocumentException; import com.lowagie.text.Recta

我在Javaapplet中使用PdfStamper对pdf文件进行签名。 问题是,每次使用pdfStamper.close()到达行时,applet都会挂起; 我认为我的问题与某些java小程序策略有关,但我已向所有人授予权限,如:

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;
            }
        } );
    }
}
import com.lowagie.text.DocumentException;
导入com.lowagie.text.Rectangle;
导入com.lowagie.text.pdf.PdfReader;
导入com.lowagie.text.pdf.pdfsignaturepearance;
导入com.lowagie.text.pdf.PdfStamper;
导入java.io.BufferedReader;
导入java.io.ByteArrayOutputStream;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.io.OutputStream;
导入java.security.AccessController;
导入java.security.KeyStore;
导入java.security.KeyStoreException;
导入java.security.NoSuchAlgorithmException;
导入java.security.PrivateKey;
导入java.security.PrivilegedAction;
导入java.security.UnrecoverableKeyException;
导入java.security.cert.Certificate;
导入java.security.cert.CertificateException;
导入java.util.Enumeration;
导入javax.swing.JApplet;
公共类SignApplet扩展了JApplet{
公开无效测试(){
AccessController.doPrivileged(新的PrivilegedAction(){
@凌驾
公共对象运行(){
试一试{
KeyStore KeyStore=KeyStore.getInstance(“PKCS11-custom_name”);
String pin=“自定义_pin”;
load(null,pin.toCharArray());
枚举别名=keyStore.alias();
字符串别名=别名。nextElement();
PrivateKey=(PrivateKey)keyStore.getKey(别名,pin.toCharArray());
证书[]链=keyStore.getCertificateChain(别名);
字符串unsigned\u pdf=“C:\\Users\\user\u name\\unsigned.pdf”;
字符串签名\u pdf=“C:\\Users\\user\u name\\signed.pdf”;
PdfReader PdfReader=newpdfreader((新文件(unsigned_pdf)).getAbsolutePath());
文件输出文件=新文件(已签名的pdf);
PdfStamper PdfStamper;
pdfStamper=pdfStamper.createSignature(pdfReader,null,“\0”,outputFile);
PdfSignatureAppearance sap=pdfStamper.getSignatureAppearance();
sap.setCrypto(key,chain,null,PdfSignatureAppearance.SELF_-SIGNED);
sap.setReason(“原因”);
sap.setLocation(“”);
setVisibleSignature(新矩形(10,10,50,30),1,空);
pdfStamper.SetFormFlatting(真);
pdfStamper.close();/--小程序就挂起在那里
}捕获(例外情况除外){
例如printStackTrace();
}
返回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方法运行相同的源代码时(对传递参数的修改很少),它工作得非常好

你知道有什么问题吗

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


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

要更快地获得更好的帮助,请发布。小程序是否已签名?如果不是,它还使用标准安全模型:您正在创建一种过时的签名类型。请阅读SJuan76:是的,我的小程序是自签名的。“我的小程序是自签名的。”如果是,整个策略文件不仅危险,而且不必要。你是打算发布那个SSCCE或者对这个建议发表评论,还是只是不理我?提示1)添加@SJuan76(重要的是
@
),以确保他们收到新评论的通知。2) 不要忽视任何发表评论或回复的人。有可能其他人看到了这个帖子,看到了评论,并想“好吧,等事情解决了,我会深入研究的”&他们还在等待。