[
https://issues.apache.org/jira/browse/PDFBOX-2596?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14279724#comment-14279724
]
John Roche commented on PDFBOX-2596:
------------------------------------
I've done some more digging and although I haven't precisely identified the
exact point it's going wrong I have figured out what's causing it. The
finalize call in COSDocument calls close(), which nullifies everything in its
objectPool member variable. This shouldn't be done in a finalize call, this
should be left up to the garbage collector. In my code I have this line:
PDPage templatePage = (PDPage)
PDDocument.load(getClass().getResourceAsStream("/pdfTemplate.pdf")).getDocumentCatalog().getAllPages().get(0);
I then use this templatePage to create each of the 36 pages in my document.
However, in debugging into this line of code we get to PDFParser::parse() which
creates a new COSDocument (which btw it never calls close() on unless there's
an exception). This COSDocument goes out of scope after this method returns
and is a candidate for garbage collection. The garbage collector calls
finalize() which calls close() and my templatePage object has its member
variables emptied out, resulting in the errant RandomAccessFileInputStream
being created in COSStream::getFilteredStream() - which is of course now after
the close() has been called (via the garbage collector) and the file member
variable nullified.
Someone asked for the stack trace. I don't know that it's going to be all that
useful but here it is:
javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException:
org.apache.pdfbox.exceptions.COSVisitorException: java.lang.NullPointerException
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:393)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:534)
org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:482)
org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:419)
com.josh.web.filter.AdminFilter.doFilter(AdminFilter.java:15)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
com.josh.web.filter.TokenFilter.doFilter(TokenFilter.java:32)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
com.josh.web.filter.ExceptionFilter.doFilter(ExceptionFilter.java:23)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:152)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
root cause
org.glassfish.jersey.server.ContainerException:
org.apache.pdfbox.exceptions.COSVisitorException: java.lang.NullPointerException
org.glassfish.jersey.servlet.internal.ResponseWriter.rethrow(ResponseWriter.java:256)
org.glassfish.jersey.servlet.internal.ResponseWriter.failure(ResponseWriter.java:238)
org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:439)
org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:267)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:297)
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:254)
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1030)
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:534)
org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:482)
org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:419)
com.josh.web.filter.AdminFilter.doFilter(AdminFilter.java:15)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
com.josh.web.filter.TokenFilter.doFilter(TokenFilter.java:32)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
com.josh.web.filter.ExceptionFilter.doFilter(ExceptionFilter.java:23)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:152)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
root cause
org.apache.pdfbox.exceptions.COSVisitorException: java.lang.NullPointerException
org.apache.pdfbox.pdfwriter.COSWriter.visitFromStream(COSWriter.java:1358)
org.apache.pdfbox.cos.COSStream.accept(COSStream.java:275)
org.apache.pdfbox.cos.COSObject.accept(COSObject.java:206)
org.apache.pdfbox.pdfwriter.COSWriter.doWriteObject(COSWriter.java:528)
org.apache.pdfbox.pdfwriter.COSWriter.doWriteBody(COSWriter.java:434)
org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(COSWriter.java:1126)
org.apache.pdfbox.cos.COSDocument.accept(COSDocument.java:578)
org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1516)
org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1351)
org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1332)
com.josh.web.admin.organisation.QrCodesForDateResource.get(QrCodesForDateResource.java:117)
sun.reflect.GeneratedMethodAccessor33.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:152)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104)
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:387)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:331)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:103)
org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:271)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:267)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:297)
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:254)
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1030)
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:534)
org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:482)
org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:419)
com.josh.web.filter.AdminFilter.doFilter(AdminFilter.java:15)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
com.josh.web.filter.TokenFilter.doFilter(TokenFilter.java:32)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
com.josh.web.filter.ExceptionFilter.doFilter(ExceptionFilter.java:23)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:152)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
root cause
java.lang.NullPointerException
org.apache.pdfbox.io.RandomAccessFileInputStream.read(RandomAccessFileInputStream.java:94)
java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
java.io.BufferedInputStream.read(BufferedInputStream.java:334)
org.apache.pdfbox.pdfwriter.COSWriter.visitFromStream(COSWriter.java:1341)
org.apache.pdfbox.cos.COSStream.accept(COSStream.java:275)
org.apache.pdfbox.cos.COSObject.accept(COSObject.java:206)
org.apache.pdfbox.pdfwriter.COSWriter.doWriteObject(COSWriter.java:528)
org.apache.pdfbox.pdfwriter.COSWriter.doWriteBody(COSWriter.java:434)
org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(COSWriter.java:1126)
org.apache.pdfbox.cos.COSDocument.accept(COSDocument.java:578)
org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1516)
org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1351)
org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1332)
com.josh.web.admin.organisation.QrCodesForDateResource.get(QrCodesForDateResource.java:117)
sun.reflect.GeneratedMethodAccessor33.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:152)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104)
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:387)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:331)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:103)
org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:271)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:267)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:297)
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:254)
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1030)
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:534)
org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:482)
org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:419)
com.josh.web.filter.AdminFilter.doFilter(AdminFilter.java:15)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
com.josh.web.filter.TokenFilter.doFilter(TokenFilter.java:32)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
com.josh.web.filter.ExceptionFilter.doFilter(ExceptionFilter.java:23)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:152)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
> NullPointerException in RandomAccessFileInputStream
> ---------------------------------------------------
>
> Key: PDFBOX-2596
> URL: https://issues.apache.org/jira/browse/PDFBOX-2596
> Project: PDFBox
> Issue Type: Bug
> Affects Versions: 1.8.8
> Reporter: John Roche
>
> Line 94 contains a synchronized(file) that throws a NullPointerException
> under some strange circumstances that I haven't been able to fully identify
> yet. I have downloaded the 1.8.8 source and the fix I used is simply to add
> "&& file != null" to the previous if statement.
> I can reproduce this bug with live user data, but I haven't been able to with
> test data yet. It happens when I try to create a pdf with 36 pages that have
> an image, some drawn coloured boxes and some text, on each page. If I remove
> some of the pages before I call save(File) it doesn't happen - depending on
> which pages I remove it can be ok with up to 26 pages, or break with fewer.
> Quite strange. I suspect it's to do with the size of the data as opposed to
> the number of pages.
> I will continue to investigate, since there seems to be some underlying
> issue, but for now I guess the null protection should be ok to add?
> Thanks,
> John
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)