iText/BouncyCastle ClassNotFound org.bouncycastle.asn1.DEREncodable and org.bouncycastle.tsp.TimeStampTokenInfo

我正在尝试使用iText Java。当您运行示例“如何签名”时,将发生以下错误:

Caused by: java.lang.ClassNotFoundException: org.bouncycastle.tsp.TimeStampTokenInfo

根据“iText入门 - 如何使用iText签署PDF”,我必须使用BouncyCastle

我从BouncyCastle下载页面下载了文件:bcprov-jdk15on-147.jar。
并添加到项目中:Java Build Path/Libraries/Add External JAR...

我添加了以下行:

Security.addProvider(new BouncyCastleProvider());

运行该示例时,将发生相同的错误。
所以我下载了另一个文件:bcpkix-jdk15on-147.jar标题为“PKIX/CMS/EAC/PKCS/OCSP/TSP/OPENSSL”
并添加到项目中:Java Build Path/Libraries/Add External JAR...
现在我有两个罐子。

当您运行该示例时,将发生以下错误:

Caused by: java.lang.ClassNotFoundException: org.bouncycastle.asn1.DEREncodable

我尝试下载文件“bcprov-ext-jdk15on-147.jar”,但没有解决问题。

我正在使用iText 5.2.1和Windows 7 64位的eclipse。


答案 1

iText 将弹跳式城堡依赖项标记为可选。如果需要它们,则需要在自己的 pom 文件中添加依赖项。

要找出要在项目中包含哪个依赖项,请打开您正在使用的版本的 itextpdf pom.xml 文件(例如 5.3.2,此处),然后搜索 2 个弹跳式城堡依赖项。

    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15on</artifactId>
        <version>1.47</version>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcmail-jdk15on</artifactId>
        <version>1.47</version>
        <optional>true</optional>
    </dependency>

将它们复制到 pom 文件中,然后删除可选选项。

    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.3.2</version>
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15on</artifactId>
        <version>1.47</version>
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcmail-jdk15on</artifactId>
        <version>1.47</version>
    </dependency>

答案 2

BouncyCastle库正在经历大量的API更改,这破坏了与iText等其他库的兼容性。

  • 使用以前版本的 BouncyCastle 库。可以在此处找到旧版本。但是,您必须找到与此特定版本的BC兼容的正确版本的iText。

  • 制作自己的iText版本(SVN主干已修复)。iText可以使用Maven构建(在SVN的根目录中有一个简短的自述文件)。请注意,风险自负,躯干中可能存在错误。

  • 等待下一个版本的 iText。根据我的经验,iText版本每隔几个月发布一次,有时更频繁,有时更少。我不是iText提交者,所以我不能给你任何ETA。

更多信息可以在此线程中找到