Itext 运行时未找到Bouncy Castle类异常

Itext 运行时未找到Bouncy Castle类异常,itext,bouncycastle,Itext,Bouncycastle,正在尝试使用iText 5.5.9添加bouncy castle provider以对我的pdf进行数字签名。在他们的站点中添加了名为(bcprov-ext-jdk15on-154.jar)的bouncy castle提供程序java5-8。以下是基于Bruno关于使用iText的数字签名白皮书的测试代码 static String keyStore = "F:\\keystores\\ks.jks"; static String src = "C:\\documenttobesign

正在尝试使用iText 5.5.9添加bouncy castle provider以对我的pdf进行数字签名。在他们的站点中添加了名为(bcprov-ext-jdk15on-154.jar)的bouncy castle提供程序java5-8。以下是基于Bruno关于使用iText的数字签名白皮书的测试代码

static String keyStore = "F:\\keystores\\ks.jks";
static String src      = "C:\\documenttobesigned.pdf";
static String dest     = "C:\\signedDocument.pdf";

public static void main(String[] args)
{
    try
    {

        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        char[] password = "password111".toCharArray();
        BouncyCastleProvider bouncyCastleCryptoProvider = new BouncyCastleProvider();
        Security.addProvider(bouncyCastleCryptoProvider);
        File file = new File(keyStore);
        InputStream is = new FileInputStream(file);
        ks.load(is, password);
        String alias = (String) ks.aliases().nextElement();
        PrivateKey pk = (PrivateKey) ks.getKey(alias, password);
        Certificate[] chain = ks.getCertificateChain(alias);
        SignHelloWorld app = new KeyStoreTest.SignHelloWorld();
        app.sign(src, String.format(dest, 2), chain, pk, DigestAlgorithms.SHA256, bouncyCastleCryptoProvider.getName(), CryptoStandard.CMS, "Reason", "Chennai");
    }
    catch (KeyStoreException e)
    {
        e.printStackTrace();
    }
    catch (FileNotFoundException fnf)
    {
        fnf.printStackTrace();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

static class SignHelloWorld
{
    public void sign(String src, String dest, Certificate[] chain, PrivateKey pk, String digestAlgorithm, String provider,
            CryptoStandard subfilter, String reason, String location) throws GeneralSecurityException, IOException, DocumentException
    {
        // Creating the reader and the stamper
        PdfReader reader = new PdfReader(src);
        FileOutputStream os = new FileOutputStream(dest);
        PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
        // Creating the appearance
        PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
        appearance.setReason(reason);
        appearance.setLocation(location);
        appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig");
        // Creating the signature
        ExternalDigest digest = new BouncyCastleDigest();
        ExternalSignature signature = new PrivateKeySignature(pk, digestAlgorithm, provider);
        MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, subfilter);
    }
}
这是堆栈跟踪

Exception in thread "main" java.lang.NoClassDefFoundError: org/spongycastle/jcajce/provider/digest/MD2$Digest
at test.KeyStoreTest$SignHelloWorld.sign(KeyStoreTest.java:84)
at test.KeyStoreTest.main(KeyStoreTest.java:53)
Caused by: java.lang.ClassNotFoundException:         org.spongycastle.jcajce.provider.digest.MD2$Digest
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 2 more

您正在使用iTextG而不是iText。有没有具体的原因?你是为Android开发的吗?你的问题没有提到Android。是的,这就是问题所在。我使用的是iText android版本,它使用的是spongyCastle而不是bouncyCastle。在这种情况下,您对spongyCastle有依赖性。你应该得到SpongyCastle jar并修改你的代码,使它引用SpongyCastle而不是BouncyCastle。有没有具体的原因?你是为Android开发的吗?你的问题没有提到Android。是的,这就是问题所在。我使用的是iText android版本,它使用的是spongyCastle而不是bouncyCastle。在这种情况下,您对spongyCastle有依赖性。您应该获得SpongyCastle jar并修改代码,使其引用SpongyCastle而不是BouncyCastle。