我想在pdf文件上放一个基本的数字签名。我正在尝试使用itext网站上提供的代码。代码如下 -
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)
我做错了什么?
答案 0 :(得分:2)
(只是将原因作为答案制定,以前作为评论提出:)
对于安全性低级操作,iText基于BouncyCastle库。这尤其涉及集成PDF签名的创建和验证,还涉及加密文档的处理。因此,在这些用例中,应用程序的类路径上需要相应的BouncyCastle提供程序库。
主要异常信息
java.lang.NoClassDefFoundError: org/bouncycastle/asn1/DEREncodable
表示此要求未完全填写,BouncyCastle根本不存在或至少不存在于所需版本中。同时,@ user1946152已经确认了他的配置。
P.S。:显然在手头的情况下,OP仍然使用了5.x之前版本的iText。虽然有一些条件强制执行此操作(例如,管理层不愿意决定何时购买许可证叹息),但您应该明确更新到当前版本的iText。同时发生了许多重大变化,特别是在电子签名,内容解析和PDF / A文档创建方面。