/** * Constructs {@link PdfCatalog#outlines} iteratively */ private void constructOutlines(PdfDictionary outlineRoot, Map<String, PdfObject> names) { if (outlineRoot == null) { return; } PdfDictionary first = outlineRoot.getAsDictionary(PdfName.First); PdfDictionary current = first; PdfDictionary next; PdfDictionary parent; HashMap<PdfDictionary, PdfOutline> parentOutlineMap = new HashMap<>(); outlines = new PdfOutline(OutlineRoot, outlineRoot, getDocument()); PdfOutline parentOutline = outlines; parentOutlineMap.put(outlineRoot, parentOutline); while (current != null) { first = current.getAsDictionary(PdfName.First); next = current.getAsDictionary(PdfName.Next); parent = current.getAsDictionary(PdfName.Parent); parentOutline = parentOutlineMap.get(parent); PdfOutline currentOutline = new PdfOutline(current.getAsString(PdfName.Title).toUnicodeString(), current, parentOutline); addOutlineToPage(currentOutline, current, names); parentOutline.getAllChildren().add(currentOutline); if (first != null) { parentOutlineMap.put(current, currentOutline); } current = getNextOutline(first, next, parent); } }