You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pdfbox.apache.org by "Guillaume Bailleul (JIRA)" <ji...@apache.org> on 2013/07/31 13:15:52 UTC

[jira] [Commented] (PDFBOX-1635) Exception on saving document

    [ https://issues.apache.org/jira/browse/PDFBOX-1635?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13725124#comment-13725124 ] 

Guillaume Bailleul commented on PDFBOX-1635:
--------------------------------------------

In your code sample, you close the source document before saving the target one.

You can fix your problem by doing
 currentPdf.close()
after
 returnDocument.save(...)

The visitor pattern is used to retrieve the objects from the source PDF an copy them to the new one. When you close the source (currentPdf), the copy cannot be done.

I guess this is a normal behavior.

                
> Exception on saving document
> ----------------------------
>
>                 Key: PDFBOX-1635
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-1635
>             Project: PDFBox
>          Issue Type: Bug
>    Affects Versions: 1.8.2
>         Environment: Ubuntu 12.04 64 Bit (kernel: 3.2.0-45-generic)
> JDK 1.6.0_33
>            Reporter: Andrew Dale
>            Assignee: Guillaume Bailleul
>
> I am performing some operations on pdf documents such as merging, spliting, reordering (pages). I am currently  encountering some issues when attempting to save the newly modified pdf file. 
> A simplified test case (extract the first 5 pages from a pdf into a new pdf) is:
>      @Test
>     public void testPdfBox2() throws Exception {
>         PDDocument returnDocument = new PDDocument();
>         String outputFilename = "/tmp/testpdfreorder.pdf";
>         List<Integer> pages = Arrays.asList(1, 2, 3, 4, 5);
>         try {
>             // get/load current document
>             PDDocument currentPdf = PDDocument.load(new File("/tmp/hibernate_reference.pdf"));
>             // get the current pages of the document
>             @SuppressWarnings("unchecked")
>             List<PDPage> currentDocumentPages = currentPdf.getDocumentCatalog().getAllPages();
>             for (Integer currentPage : pages) {
>                 returnDocument.importPage(currentDocumentPages.get(currentPage - 1));
>             }
>             currentPdf.close();
>         } finally {
>             returnDocument.save(outputFilename);
>             returnDocument.close();
>         }
>     }
> The problem is caused in the above code by calling currentPdf.close() before the returnDocument.save has been called. This looks very similar to this issue PDFBOX-1586 which is marked as "fixed" in 1.8.2, but in my opinion it is not.
> The stacktrace I am currently getting is:
> org.apache.pdfbox.exceptions.COSVisitorException: java.lang.IndexOutOfBoundsException: Index: 72, Size: 0
> 	at org.apache.pdfbox.pdfwriter.COSWriter.visitFromStream(COSWriter.java:1354)
> 	at org.apache.pdfbox.cos.COSStream.accept(COSStream.java:217)
> 	at org.apache.pdfbox.cos.COSObject.accept(COSObject.java:206)
> 	at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObject(COSWriter.java:525)
> 	at org.apache.pdfbox.pdfwriter.COSWriter.doWriteBody(COSWriter.java:435)
> 	at org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(COSWriter.java:1122)
> 	at org.apache.pdfbox.cos.COSDocument.accept(COSDocument.java:552)
> 	at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1501)
> 	at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1324)
> 	at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1305)
> 	at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1292)
> 	at com.test.PdfBoxTest.testPdfBox2(PdfBoxTest.java:72)
> 	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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
> 	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
> 	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
> 	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
> 	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
> 	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
> 	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
> 	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
> 	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
> 	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
> 	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
> 	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
> 	at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
> 	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
> 	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
> 	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
> 	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
> 	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
> 	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> Caused by: java.lang.IndexOutOfBoundsException: Index: 72, Size: 0
> 	at java.util.ArrayList.RangeCheck(ArrayList.java:547)
> 	at java.util.ArrayList.get(ArrayList.java:322)
> 	at org.apache.pdfbox.io.RandomAccessBuffer.seek(RandomAccessBuffer.java:84)
> 	at org.apache.pdfbox.io.RandomAccessFileInputStream.read(RandomAccessFileInputStream.java:96)
> 	at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
> 	at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
> 	at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
> 	at org.apache.pdfbox.pdfwriter.COSWriter.visitFromStream(COSWriter.java:1337)
> 	... 34 more

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira