[ 
https://issues.apache.org/jira/browse/PDFBOX-6102?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Christian Haegele updated PDFBOX-6102:
--------------------------------------
    Description: 
When copying 1000+ bookmarks from one document to another, a StackOverflowError 
is caused in PDFBox. The Exception doesn't occure in 
pdfbox 2.0.30.
 

 
{code:java}
   @Test
    void pdfBoxBookmarksTest() throws IOException {

        Path outputFolder = Files.createTempDirectory("pdfBox30Test");
        Path bookmarkedPdf = outputFolder.resolve("bookmarked.pdf");

        try (PDDocument sourceDocument = 
Loader.loadPDF(stackOverflowPdfPath.toFile());
                PDDocument targetDocument = 
Loader.loadPDF(stackOverflowPdfPath.toFile())) {

            PDDocumentOutline sourceOutline = 
sourceDocument.getDocumentCatalog().getDocumentOutline();

            PDOutlineItem current = sourceOutline.getFirstChild();
            while (current != null) {
                PDPage sourcePage = current.findDestinationPage(sourceDocument);
                if (sourcePage != null) {
                    PDPage copiedPage = targetDocument.importPage(sourcePage);

                    // PdfUtilities.createBookmark(targetDocument, copiedPage, 
current.getTitle());
                    // create bookmark
                    var aBookmarkTitle = current.getTitle();
                    if (aBookmarkTitle != null) {
                        PDPageXYZDestination tempDestXyz = new 
PDPageXYZDestination();
                        int pageIndex = 
targetDocument.getPages().indexOf(copiedPage); // 0-based
                        tempDestXyz.setPageNumber(pageIndex + 1); // 1-based 
for destination
                        tempDestXyz.setLeft((int) 
copiedPage.getCropBox().getLowerLeftX());
                        tempDestXyz.setTop((int) 
copiedPage.getCropBox().getUpperRightY());
                        tempDestXyz.setZoom(0);

                        PDOutlineItem bookmark = new PDOutlineItem();
                        bookmark.setDestination(tempDestXyz);
                        bookmark.setTitle(aBookmarkTitle);
                        
targetDocument.getDocumentCatalog().getDocumentOutline().addLast(bookmark);
                    }

                }
                current = current.getNextSibling();
            }

            targetDocument.save(bookmarkedPdf.toFile());
        } catch (IOException e) {
            Assertions.fail("Failed to create bookmarked PDF: " + 
e.getMessage());
        }

    }    @Test
    void pdfBoxBookmarksTest() throws IOException {

        Path outputFolder = Files.createTempDirectory("pdfBox30Test");
        Path bookmarkedPdf = outputFolder.resolve("bookmarked.pdf");

        try (PDDocument sourceDocument = 
Loader.loadPDF(stackOverflowPdfPath.toFile());
                PDDocument targetDocument = 
Loader.loadPDF(stackOverflowPdfPath.toFile())) {

            PDDocumentOutline sourceOutline = 
sourceDocument.getDocumentCatalog().getDocumentOutline();

            PDOutlineItem current = sourceOutline.getFirstChild();
            while (current != null) {
                PDPage sourcePage = current.findDestinationPage(sourceDocument);
                if (sourcePage != null) {
                    PDPage copiedPage = targetDocument.importPage(sourcePage);

                    // PdfUtilities.createBookmark(targetDocument, copiedPage, 
current.getTitle());
                    // create bookmark
                    var aBookmarkTitle = current.getTitle();
                    if (aBookmarkTitle != null) {
                        PDPageXYZDestination tempDestXyz = new 
PDPageXYZDestination();
                        int pageIndex = 
targetDocument.getPages().indexOf(copiedPage); // 0-based
                        tempDestXyz.setPageNumber(pageIndex + 1); // 1-based 
for destination
                        tempDestXyz.setLeft((int) 
copiedPage.getCropBox().getLowerLeftX());
                        tempDestXyz.setTop((int) 
copiedPage.getCropBox().getUpperRightY());
                        tempDestXyz.setZoom(0);

                        PDOutlineItem bookmark = new PDOutlineItem();
                        bookmark.setDestination(tempDestXyz);
                        bookmark.setTitle(aBookmarkTitle);
                        
targetDocument.getDocumentCatalog().getDocumentOutline().addLast(bookmark);
                    }

                }
                current = current.getNextSibling();
            }

            targetDocument.save(bookmarkedPdf.toFile());
        } catch (IOException e) {
            Assertions.fail("Failed to create bookmarked PDF: " + 
e.getMessage());
        }

    }
{code}

  was:
When copying 1000+ bookmarks from one document to another, a StackOverflowError 
is caused in PDFBox. The Exception doesn't occure in 
pdfbox 2.0.30.
 
 
```
    @Test
    void pdfBoxBookmarksTest() throws IOException {

        Path outputFolder = Files.createTempDirectory("pdfBox30Test");
        Path bookmarkedPdf = outputFolder.resolve("bookmarked.pdf");

        try (PDDocument sourceDocument = 
Loader.loadPDF(stackOverflowPdfPath.toFile());
                PDDocument targetDocument = 
Loader.loadPDF(stackOverflowPdfPath.toFile())) {

            PDDocumentOutline sourceOutline = 
sourceDocument.getDocumentCatalog().getDocumentOutline();

            PDOutlineItem current = sourceOutline.getFirstChild();
            while (current != null) {
                PDPage sourcePage = current.findDestinationPage(sourceDocument);
                if (sourcePage != null) {
                    PDPage copiedPage = targetDocument.importPage(sourcePage);

                    // PdfUtilities.createBookmark(targetDocument, copiedPage, 
current.getTitle());
                    // create bookmark
                    var aBookmarkTitle = current.getTitle();
                    if (aBookmarkTitle != null) {
                        PDPageXYZDestination tempDestXyz = new 
PDPageXYZDestination();
                        int pageIndex = 
targetDocument.getPages().indexOf(copiedPage); // 0-based
                        tempDestXyz.setPageNumber(pageIndex + 1); // 1-based 
for destination
                        tempDestXyz.setLeft((int) 
copiedPage.getCropBox().getLowerLeftX());
                        tempDestXyz.setTop((int) 
copiedPage.getCropBox().getUpperRightY());
                        tempDestXyz.setZoom(0);

                        PDOutlineItem bookmark = new PDOutlineItem();
                        bookmark.setDestination(tempDestXyz);
                        bookmark.setTitle(aBookmarkTitle);
                        
targetDocument.getDocumentCatalog().getDocumentOutline().addLast(bookmark);
                    }

                }
                current = current.getNextSibling();
            }

            targetDocument.save(bookmarkedPdf.toFile());
        } catch (IOException e) {
            Assertions.fail("Failed to create bookmarked PDF: " + 
e.getMessage());
        }

    }    @Test
    void pdfBoxBookmarksTest() throws IOException {

        Path outputFolder = Files.createTempDirectory("pdfBox30Test");
        Path bookmarkedPdf = outputFolder.resolve("bookmarked.pdf");

        try (PDDocument sourceDocument = 
Loader.loadPDF(stackOverflowPdfPath.toFile());
                PDDocument targetDocument = 
Loader.loadPDF(stackOverflowPdfPath.toFile())) {

            PDDocumentOutline sourceOutline = 
sourceDocument.getDocumentCatalog().getDocumentOutline();

            PDOutlineItem current = sourceOutline.getFirstChild();
            while (current != null) {
                PDPage sourcePage = current.findDestinationPage(sourceDocument);
                if (sourcePage != null) {
                    PDPage copiedPage = targetDocument.importPage(sourcePage);

                    // PdfUtilities.createBookmark(targetDocument, copiedPage, 
current.getTitle());
                    // create bookmark
                    var aBookmarkTitle = current.getTitle();
                    if (aBookmarkTitle != null) {
                        PDPageXYZDestination tempDestXyz = new 
PDPageXYZDestination();
                        int pageIndex = 
targetDocument.getPages().indexOf(copiedPage); // 0-based
                        tempDestXyz.setPageNumber(pageIndex + 1); // 1-based 
for destination
                        tempDestXyz.setLeft((int) 
copiedPage.getCropBox().getLowerLeftX());
                        tempDestXyz.setTop((int) 
copiedPage.getCropBox().getUpperRightY());
                        tempDestXyz.setZoom(0);

                        PDOutlineItem bookmark = new PDOutlineItem();
                        bookmark.setDestination(tempDestXyz);
                        bookmark.setTitle(aBookmarkTitle);
                        
targetDocument.getDocumentCatalog().getDocumentOutline().addLast(bookmark);
                    }

                }
                current = current.getNextSibling();
            }

            targetDocument.save(bookmarkedPdf.toFile());
        } catch (IOException e) {
            Assertions.fail("Failed to create bookmarked PDF: " + 
e.getMessage());
        }

    }
```


> StackOverflowError when Copying 1000+ bookmarks
> -----------------------------------------------
>
>                 Key: PDFBOX-6102
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-6102
>             Project: PDFBox
>          Issue Type: Bug
>          Components: Utilities
>    Affects Versions: 3.0.6 PDFBox
>            Reporter: Christian Haegele
>            Priority: Major
>         Attachments: 3000_bookmarks.pdf
>
>
> When copying 1000+ bookmarks from one document to another, a 
> StackOverflowError is caused in PDFBox. The Exception doesn't occure in 
> pdfbox 2.0.30.
>  
>  
> {code:java}
>    @Test
>     void pdfBoxBookmarksTest() throws IOException {
>         Path outputFolder = Files.createTempDirectory("pdfBox30Test");
>         Path bookmarkedPdf = outputFolder.resolve("bookmarked.pdf");
>         try (PDDocument sourceDocument = 
> Loader.loadPDF(stackOverflowPdfPath.toFile());
>                 PDDocument targetDocument = 
> Loader.loadPDF(stackOverflowPdfPath.toFile())) {
>             PDDocumentOutline sourceOutline = 
> sourceDocument.getDocumentCatalog().getDocumentOutline();
>             PDOutlineItem current = sourceOutline.getFirstChild();
>             while (current != null) {
>                 PDPage sourcePage = 
> current.findDestinationPage(sourceDocument);
>                 if (sourcePage != null) {
>                     PDPage copiedPage = targetDocument.importPage(sourcePage);
>                     // PdfUtilities.createBookmark(targetDocument, 
> copiedPage, current.getTitle());
>                     // create bookmark
>                     var aBookmarkTitle = current.getTitle();
>                     if (aBookmarkTitle != null) {
>                         PDPageXYZDestination tempDestXyz = new 
> PDPageXYZDestination();
>                         int pageIndex = 
> targetDocument.getPages().indexOf(copiedPage); // 0-based
>                         tempDestXyz.setPageNumber(pageIndex + 1); // 1-based 
> for destination
>                         tempDestXyz.setLeft((int) 
> copiedPage.getCropBox().getLowerLeftX());
>                         tempDestXyz.setTop((int) 
> copiedPage.getCropBox().getUpperRightY());
>                         tempDestXyz.setZoom(0);
>                         PDOutlineItem bookmark = new PDOutlineItem();
>                         bookmark.setDestination(tempDestXyz);
>                         bookmark.setTitle(aBookmarkTitle);
>                         
> targetDocument.getDocumentCatalog().getDocumentOutline().addLast(bookmark);
>                     }
>                 }
>                 current = current.getNextSibling();
>             }
>             targetDocument.save(bookmarkedPdf.toFile());
>         } catch (IOException e) {
>             Assertions.fail("Failed to create bookmarked PDF: " + 
> e.getMessage());
>         }
>     }    @Test
>     void pdfBoxBookmarksTest() throws IOException {
>         Path outputFolder = Files.createTempDirectory("pdfBox30Test");
>         Path bookmarkedPdf = outputFolder.resolve("bookmarked.pdf");
>         try (PDDocument sourceDocument = 
> Loader.loadPDF(stackOverflowPdfPath.toFile());
>                 PDDocument targetDocument = 
> Loader.loadPDF(stackOverflowPdfPath.toFile())) {
>             PDDocumentOutline sourceOutline = 
> sourceDocument.getDocumentCatalog().getDocumentOutline();
>             PDOutlineItem current = sourceOutline.getFirstChild();
>             while (current != null) {
>                 PDPage sourcePage = 
> current.findDestinationPage(sourceDocument);
>                 if (sourcePage != null) {
>                     PDPage copiedPage = targetDocument.importPage(sourcePage);
>                     // PdfUtilities.createBookmark(targetDocument, 
> copiedPage, current.getTitle());
>                     // create bookmark
>                     var aBookmarkTitle = current.getTitle();
>                     if (aBookmarkTitle != null) {
>                         PDPageXYZDestination tempDestXyz = new 
> PDPageXYZDestination();
>                         int pageIndex = 
> targetDocument.getPages().indexOf(copiedPage); // 0-based
>                         tempDestXyz.setPageNumber(pageIndex + 1); // 1-based 
> for destination
>                         tempDestXyz.setLeft((int) 
> copiedPage.getCropBox().getLowerLeftX());
>                         tempDestXyz.setTop((int) 
> copiedPage.getCropBox().getUpperRightY());
>                         tempDestXyz.setZoom(0);
>                         PDOutlineItem bookmark = new PDOutlineItem();
>                         bookmark.setDestination(tempDestXyz);
>                         bookmark.setTitle(aBookmarkTitle);
>                         
> targetDocument.getDocumentCatalog().getDocumentOutline().addLast(bookmark);
>                     }
>                 }
>                 current = current.getNextSibling();
>             }
>             targetDocument.save(bookmarkedPdf.toFile());
>         } catch (IOException e) {
>             Assertions.fail("Failed to create bookmarked PDF: " + 
> e.getMessage());
>         }
>     }
> {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to