[
https://issues.apache.org/jira/browse/PDFBOX-3207?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Frank Becker updated PDFBOX-3207:
---------------------------------
Attachment: allow_addFirst_and_addLast_to_add_items_with_siblings.patch
> Allow addFirst and addLast to add Items with siblings
> -----------------------------------------------------
>
> Key: PDFBOX-3207
> URL: https://issues.apache.org/jira/browse/PDFBOX-3207
> Project: PDFBox
> Issue Type: Improvement
> Components: PDModel
> Affects Versions: 2.0.0
> Reporter: Frank Becker
> Priority: Minor
> Attachments:
> allow_addFirst_and_addLast_to_add_items_with_siblings.patch
>
>
> Currently it is not possible to add a PDOutlineItem with siblings to another
> node with addFirst or addLast.
> Imagine you want to merge two documents. Each document has an outline.
> For the destination you want an outline where each document is represented
> with the title of the Document as outline item where the original outline
> nodes are appended to.
> To achieve that you need to:
> * add a new outline to the document.
> * create a new outline item with the title of the document
> * iterate over each child of the previous outline
> ** create a deep copy of the child to get rid of the previous and next sibling
> ** add the copy of the child to the new bookmark
> Little example code in groovy:
> {code}
> def bookmark() {
> if ( document != null ) {
> if (document.getPages().size() > 0) {
> def originalOutline =
> this.document.documentCatalog.documentOutline
> def newOutline = new PDDocumentOutline()
> def destination = new PDPageFitWidthDestination()
> def bookmark = new PDOutlineItem()
> destination.setPage(document.getPages().get(0))
> bookmark.title = bookmarkTitle
> bookmark.destination = destination
> if(originalOutline) {
> appendOriginalBookmarks(originalOutline, bookmark)
> }
> newOutline.addLast(bookmark)
> document.documentCatalog.documentOutline = newOutline
> }
> }
> }
> private Iterable<PDOutlineItem> appendOriginalBookmarks(PDOutlineNode
> originalOutline, PDOutlineItem bookmark) {
> originalOutline.children().each { oldBookmark ->
> PDOutlineItem bookmarkClone = cloneBookmark(oldBookmark)
> if(oldBookmark.hasChildren()){
> appendOriginalBookmarks(oldBookmark,bookmarkClone)
> }
> bookmark.addLast(bookmarkClone)
> }
> }
> private PDOutlineItem cloneBookmark(PDOutlineItem bookmark) {
> def bookmarkClone = new PDOutlineItem()
> bookmarkClone.title = bookmark.title
> bookmarkClone.destination = bookmark.destination
> bookmarkClone.action = bookmark.action
> bookmarkClone.structureElement = bookmark.structureElement
> bookmarkClone.bold = bookmark.bold
> bookmarkClone.italic = bookmark.italic
> bookmarkClone.textColor = bookmark.textColor
> bookmarkClone
> }
> {code}
> That is a bit inconvenient.
> It should look like that:
> {code:java}
> def originalOutline =
> this.document.documentCatalog.documentOutline
> def newOutline = new PDDocumentOutline()
> def destination = new PDPageFitWidthDestination()
> def bookmark = new PDOutlineItem()
> destination.setPage(document.getPages().get(0))
> bookmark.title = bookmarkTitle
> bookmark.destination = destination
> if(originalOutline) {
> bookmark.addLast(originalOutline.getFirstChild());
> }
> newOutline.addLast(bookmark)
> document.documentCatalog.documentOutline = newOutline
> {code}
> I'll add a patch that should make it possible.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]