2013-04-06 112 views
0

我想把一個基本的數字簽名放在pdf文件上。我想使用設在iText的website.The代碼的代碼如下 -無法使用itext和java數字簽名pdf

public class DigiSign { 
public static void main(String a[]) 
{ 
    try { 

     KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
     ks.load(new FileInputStream("C:\\WSR\\keystore.ks"), "password".toCharArray()); 
     String alias = (String) ks.aliases().nextElement(); 
     PrivateKey key = (PrivateKey) ks.getKey(alias, "password".toCharArray()); 
     java.security.cert.Certificate[] chain = ks.getCertificateChain(alias); 
     PdfReader reader = new PdfReader("C:\\WSR\\a.pdf"); 
     FileOutputStream fout = new FileOutputStream("C:\\WSR\\signed.pdf"); 
     PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0'); 
     PdfSignatureAppearance sap = stp.getSignatureAppearance(); 
     sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED); 
     sap.setReason("arpit"); 
     sap.setLocation("arpit"); 
     // comment next line to have an invisible signature 
     sap.setVisibleSignature(new Rectangle(10, 10, 20, 20), 1, null); 
     stp.close(); 
    } catch (Exception ex) { 
     Logger.getLogger(DigiSign.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

}

我創建使用

的keytool -genkey -keyalg RSA -alias MYNAME的關鍵 - keypass password -keystore keystore.ks -dname「cn = Paulo Soares,c = PT」 並將abc123設置爲我的密碼。 現在,當我運行這段代碼我得到這個例外

Exception in thread "main" java.lang.NoClassDefFoundError: org/bouncycastle/asn1/DEREncodable 
    at com.lowagie.text.pdf.PdfSignatureAppearance.getAppearance(Unknown Source) 
    at com.lowagie.text.pdf.PdfSignatureAppearance.preClose(Unknown Source) 
    at com.lowagie.text.pdf.PdfSignatureAppearance.preClose(Unknown Source) 
    at com.lowagie.text.pdf.PdfStamper.close(Unknown Source) 
    at DigiSign.main(DigiSign.java:42) 
    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) 

我到底做錯了什麼?

+1

看起來您已經忘記將Bouncy Castle添加到您的課程路徑中(或者有錯誤的版本)。此外,你應該看看這個[白皮書](http://itextpdf.com/book/digitalsignatures/)。 – mkl 2013-04-06 06:52:52

+0

是的,我確實忘了導入充氣城堡到我的項目..添加它..和代碼現在正在工作 – user1946152 2013-04-06 14:56:04

+0

哎唷,但您使用的已過時的簽名類型。請閱讀http://itextpdf.com/book/digitalsignatures,否則當您交付代碼時,您的客戶會感到非常失望。 – 2013-04-07 09:26:42

回答

2

(只是制定事業爲已提交的評論之前:)

出於安全低級操作iText的答案是基於BouncyCastle的庫。這尤其涉及集成PDF簽名的創建和驗證,但也涉及加密文檔的處理。因此,在這些用例中,應用程序的類路徑上需要適當的BouncyCastle提供程序庫。

主要例外信息

java.lang.NoClassDefFoundError: org/bouncycastle/asn1/DEREncodable 

表明這一要求並不fullfilled,無論是BouncyCastle的是不存在於所有或至少不存在於所需的版本。與此同時,@ user1946152對他的配置進行了確認。

P.S .:很顯然,在手邊的情況下,OP仍然使用iText之前的5.x版本。雖然在某些情況下強制執行此操作(例如,管理人員不願意決定何時購買許可嘆息),但您應該明確更新到當前版本的iText。同時也發生了很大的變化,特別是在電子簽名,內容解析和PDF/A文檔創建等領域。