当我从代码库中调用PdfEncryptor.encrypt()
时,我面临上述异常。在SO中我发现通常它是因为itextpdf和bouncycastle jar的错误组合而发生的。但我有下面提到的
我认为依赖关系是正确的。
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.1.3</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
<version>1.46</version>
</dependency>
<dependency>
<groupId>com.test</groupId>
<artifactId>test</artifactId>
<version>1.0.0</version>
</dependency>
我们通过其他项目(测试)间接地依赖itext。 “测试”项目有以下条目
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.0.4</version>
</dependency>
Stacktrace:
class“org.bouncycastle.asn1.ASN1ObjectIdentifier”的签名者 信息与其他类的签名者信息不匹配 相同的包裹 在java.lang.ClassLoader.checkCerts(ClassLoader.java:952) at java.lang.ClassLoader.preDefineClass(ClassLoader.java:666) at java.lang.ClassLoader.defineClass(ClassLoader.java:794) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 在org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2494) 在org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:860) 在org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1302) 在org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167) 在com.itextpdf.text.pdf.PdfEncryption。(PdfEncryption.java:147) at com.itextpdf.text.pdf.PdfWriter.setEncryption(PdfWriter.java:2041) at com.itextpdf.text.pdf.PdfStamper.setEncryption(PdfStamper.java:295) at com.itextpdf.text.pdf.PdfStamper.setEncryption(PdfStamper.java:330) at com.itextpdf.text.pdf.PdfEncryptor.encrypt(PdfEncryptor.java:206)
如果您有任何解决方案,请告诉我。这将非常有帮助
答案 0 :(得分:4)
你混合了两个iText版本:一个过时的版本,指的是我的名字(com.lowagie
),可以追溯到2007年6月,还有一个较新的版本(com.itextpdf
),可以追溯到2011年11月。这两个不同的iText版本需要不同版本的BouncyCastle。您应该限制使用单个版本的iText(最好是2016年之前的版本)并使用相应的BouncyCastle版本。您将在POM中找到所需的BouncyCastle版本,该版本随您正在使用的iText版本一起提供。请注意,您还必须小心检查代码的部署位置。某些Web服务器附带的BouncyCastle版本与您需要的版本不同。这可能导致不一致。另一个例子是Android。 Android附带旧版本的BouncyCastle和软件,需要与旧版本发生新版本冲突。这就是iTextG(iText的Android端口)使用SpongyCastle而不是BouncyCastle的原因。 SpongyCastle与BouncyCastle相同,但包名称除外。这样SpongyCastle就不会与Android上提供的BouncyCastle版本冲突。
长话短说你说我有下面提到的依赖,但你的假设哪个是正确的我认为是错误的,因为你将两种不同版本的iText混合在一起。