0

PDF ドキュメントにデジタル署名しようとすると、このエラーが発生します。SOURCEPDF 名と DESTINATIONPDF 名 (デジタル署名済み) pdf 名の 2 つの pdf を渡します。SOURCEPDF での最初のデジタル署名の後、 DESTINATIONPDF を取得します。2 番目のデジタル署名では、宛先 PDF と同様にソース PDF として DESTINATIONPDF を使用しています。

これが私のコードです

try
{
    for(int i=1;i<=signature_Count;i++)
    {
        if(i==1)
        {
            tmpPdfSource=sourcePdfPath;
        }else{
            this.tmpPdfSource=destinationPdfPath;
        }

        int pageNo=Integer.parseInt(ad.readXML(xmlString, rootName,"PageNo-"+i));
        String imageSource=ad.readXML(xmlString, rootName,"ImageSource-"+i);
        float llx=Float.parseFloat(ad.readXML(xmlString, rootName,"llx-"+i));
        float lly=Float.parseFloat(ad.readXML(xmlString, rootName,"lly-"+i));
        float urx=Float.parseFloat(ad.readXML(xmlString, rootName,"urx-"+i));
        float ury=Float.parseFloat(ad.readXML(xmlString, rootName,"ury-"+i));
        String signature=ad.readXML(xmlString, rootName,"SignatureName-"+i);

        File dest = new File(destinationPdfPath);
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        ks.load(new Fil eInputStream(certificatePath), keystore_password.toCharArray());
        String alias = (String) ks.aliases().nextElement();
        PrivateKey pk = (PrivateKey) ks.getKey(alias,key_password.toCharArray());
        java.security.cert.Certificate[] chain = ks.getCertificateChain(alias);
        PdfReader reader = new PdfReader(tmpPdfSource);
        stamper = PdfStamper.createSignature(reader,new FileOutputStream(dest), '\0', null, true);
        PdfSignatureAppearance appearance = stamper.getSignatureAppearance();

        appearance.setCrypto(pk, chain, null,PdfSignatureAppearance.SELF_SIGNED);

        if (true)
        {
            appearance.setAcro6Layers(true);
            Image img=Image.getInstance(imageSource);
            appearance.setImage(img);
            appearance.setVisibleSignature(new com.itextpdf.text.Rectangle(llx, lly, urx, ury), pageNo, signature);
        }
    }//for
    stamper.close();
} catch (Exception e) {
    GenericLog gl=new  GenericLog();
    gl.writeWarning("Error Occured in SignPdfDocument ");
    gl.writeError(e);
    e.printStackTrace();
}

このエラーを修正するのを手伝ってください。

4

2 に答える 2

1

コードを再フォーマットして読みやすくすると、問題が明らかになります。

for(int i=1;i<=signature_Count;i++)
{
    if(i==1)
    {
        tmpPdfSource=sourcePdfPath;
    }else{
        this.tmpPdfSource=destinationPdfPath;
    }
    [...]
    File dest = new File(destinationPdfPath);
    [...]
    PdfReader reader = new PdfReader(tmpPdfSource);
    stamper = PdfStamper.createSignature(reader,new FileOutputStream(dest), '\0', null, true);
    [...]
}//for
stamper.close();

2 回目の繰り返しから、前の繰り返しで生成されたファイルを読み取ると、ループの外ではなく、繰り返しの最後にPdfStamperそれを閉じる必要があります。stamperfor

    stamper = PdfStamper.createSignature(reader,new FileOutputStream(dest), '\0', null, true);
    [...]
    stamper.close();
}//for

new FileOutputStream(dest)さらに、閉じた直後に変数に入れて明示的に閉じたほうがよいstamper:

    FileOutputStream fout = new FileOutputStream(dest);
    stamper = PdfStamper.createSignature(reader, fout, '\0', null, true);
    [...]
    stamper.close();
    fout.close();
}//for

そしてもちろん、Bruno のアドバイスに従い、彼の PDF 署名に関するホワイト ペーパーを読み、署名作成コードを更新して非推奨タイプ以外の署名を生成してください。

于 2013-02-12T14:55:00.823 に答える
0

setCrypto()最新バージョンの iText を使用していないことを意味する方法が表示されます。PdfSignatureAppearance.SELF_SIGNEDまた、今日の標準に準拠していない署名を作成していることを意味するオプションも表示されます。

よろしければ、ドキュメントをお読みください。

また、ソースと宛先として同じファイルを使用していますか? それ無理。少なくとも一時ファイルを作成するか、メモリ内にファイルを作成してから、既存のファイルを上書きする必要があります。

于 2013-02-12T13:52:23.037 に答える