Frank Becker created PDFBOX-3207:
------------------------------------
Summary: 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
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
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]