Reputation: 21
I am getting the following exception when I am trying to upload a password protected PDF file in my application:
How to solve this problem? I tried different itext versions but still the same error. Is there anyway I can solve this issue? Thanks.
java.lang.ClassNotFoundException: org.bouncycastle.asn1.DEREncodable
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1358)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
at com.itextpdf.text.pdf.PdfEncryption.<init>(PdfEncryption.java:138)
at com.itextpdf.text.pdf.PdfReader.readDecryptedDocObj(PdfReader.java:762)
at com.itextpdf.text.pdf.PdfReader.readDocObj(PdfReader.java:1133)
at com.itextpdf.text.pdf.PdfReader.readPdf(PdfReader.java:511)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:171)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:160)
at com.quepio.web.controller.TutoContentController.processChapterContent(TutoContentController.java:2582)
at com.quepio.web.controller.TutoContentController.saveOrUpdateContent(TutoContentController.java:1694)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:933)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:867)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.quepio.web.TwoFactorAuthenticationFilter.doFilterInternal(TwoFactorAuthenticationFilter.java:54)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.quepio.web.FirstLoginFilter.doFilterInternal(FirstLoginFilter.java:108)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
I am using the following jars.
itext: 5.3.2
bcprov-jdk15on: 1.47
bcmail-jdk15on: 1.47
Upvotes: 0
Views: 912
Reputation: 77528
You have to look at the POM file that ships with iText: pom.xml
You'll discover that the current version of iText is 5.5.7:
<artifactId>itextpdf</artifactId>
<packaging>jar</packaging>
<name>iText, a Free Java-PDF library</name>
<version>5.5.7</version>
<description>iText, a free Java-PDF library</description>
Now scroll down to the dependencies and look for BouncyCastle:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.49</version>
<type>jar</type>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.49</version>
<type>jar</type>
<scope>compile</scope>
<optional>true</optional>
</dependency>
As you can see, the BC version that works with 5.5.7 is BC 1.49.
The POM files are provided, so that developers don't have to resort to "trial and error." If you are familiar with Maven, just use the POM file and you don't have to worry about which BouncyCastle version to use. All the dependencies will be downloaded automatically through Maven.
Of course: you have to make sure that BC is also available in the CLASSPATH of your server. You also need to take special care to make sure that you have only one version of BouncyCastle. A ClassNotFoundException
doesn't always mean that the class isn't present. It can also mean that there's an ambiguity. If you have a class named DEREncodable
in one version of BC that is in your CLASSPATH and a class with the same name in another version of BC that is in your class path, the JVM won't know which class to use and will also throw a ClassNotFoundException
.
Upvotes: 1