Search code examples
javapdfbox

Adding Top level Bookmark to the exsting PDF using PDFBOX


I would like to add a top level bookmark to an existing pdf file using PDFBOX in JAVA.

Not sure why the following code was not working, can anyone help me out? Thanks.

Below is how the Document.pdf looks like in the bookmark section.

Top
---Node-1
-------Node-11
-------Node-12
....
---Node-2
-------Node-21
....

Java code (Part within the program) :

PDDocument document = PDDocument.load(new File("C:/Users/Desktop/document.pdf")) 
    PDDocumentOutline documentOutline = new PDDocumentOutline();
    document.getDocumentCatalog().setDocumentOutline(documentOutline);
    PDOutlineItem pagesOutline = new PDOutlineItem();
    pagesOutline.setTitle("All Pages");
    documentOutline.addFirst(pagesOutline);

    pagesOutline.openNode();
    documentOutline.openNode();

    document.getDocumentCatalog().setPageMode(PageMode.USE_OUTLINES);

    document.save("C:/Users/Desktop/document.pdf");

    document.close()

Solution

  • Here's my attempt at this, I'm keeping my filename if asked questions later.

    What I did is to wrap the old outline into a new item. It is not possible to add the existing items one by one, because only "orphans" can be added.

    PDDocument document = PDDocument.load(new File("000009.pdf")); 
    PDDocumentOutline oldDocumentOutline = document.getDocumentCatalog().getDocumentOutline();
    PDDocumentOutline documentOutline = new PDDocumentOutline();
    document.getDocumentCatalog().setDocumentOutline(documentOutline);
    PDOutlineItem pagesOutline = new PDOutlineItem();
    //pagesOutline.setTitle("All Pages");
    //documentOutline.addFirst(pagesOutline);
    PDOutlineItem oldOutlineItemWrapped = new PDOutlineItem(oldDocumentOutline.getCOSObject());
    oldOutlineItemWrapped.setTitle("All Pages");
    documentOutline.addFirst(oldOutlineItemWrapped);
    
    //pagesOutline.openNode();
    oldOutlineItemWrapped.openNode();
    documentOutline.openNode();
    
    document.getDocumentCatalog().setPageMode(PageMode.USE_OUTLINES);
    
    document.save("000009-modified.pdf");
    
    document.close();