You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2018/12/30 09:37:46 UTC

svn commit: r1849965 - /pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java

Author: tilman
Date: Sun Dec 30 09:37:46 2018
New Revision: 1849965

URL: http://svn.apache.org/viewvc?rev=1849965&view=rev
Log:
PDFBOX-4416: merge /IDTree

Modified:
    pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java?rev=1849965&r1=1849964&r2=1849965&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java Sun Dec 30 09:37:46 2018
@@ -51,6 +51,7 @@ import org.apache.pdfbox.pdmodel.PDDocum
 import org.apache.pdfbox.pdmodel.PDDocumentNameDictionary;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDResources;
+import org.apache.pdfbox.pdmodel.PDStructureElementNameTreeNode;
 import org.apache.pdfbox.pdmodel.PageMode;
 import org.apache.pdfbox.pdmodel.common.PDDestinationOrAction;
 import org.apache.pdfbox.pdmodel.common.PDMetadata;
@@ -820,6 +821,7 @@ public class PDFMergerUtility
 
             mergeKEntries(cloner, srcStructTree, destStructTree);
             mergeRoleMap(srcStructTree, destStructTree);
+            mergeIDTree(cloner, srcStructTree, destStructTree);
         }
     }
 
@@ -864,6 +866,39 @@ public class PDFMergerUtility
         }
     }
 
+    private void mergeIDTree(PDFCloneUtility cloner,
+            PDStructureTreeRoot srcStructTree,
+            PDStructureTreeRoot destStructTree) throws IOException
+    {
+        PDNameTreeNode<PDStructureElement> srcIDTree = srcStructTree.getIDTree();
+        PDNameTreeNode<PDStructureElement> destIDTree = destStructTree.getIDTree();
+        if (srcIDTree == null)
+        {
+            return;
+        }
+        if (destIDTree == null)
+        {
+            destIDTree = new PDStructureElementNameTreeNode();
+        }
+        Map<String, PDStructureElement> srcNames = getIDTreeAsMap(srcIDTree);
+        Map<String, PDStructureElement> destNames = getIDTreeAsMap(destIDTree);
+        for (Map.Entry<String, PDStructureElement> entry : srcNames.entrySet())
+        {
+            if (destNames.containsKey(entry.getKey()))
+            {
+                LOG.warn("key " + entry.getKey() + " already exists in destination IDTree");
+            }
+            else
+            {
+                destNames.put(entry.getKey(),
+                              new PDStructureElement((COSDictionary) cloner.cloneForNewDocument(entry.getValue().getCOSObject())));
+            }
+        }
+        destIDTree = new PDStructureElementNameTreeNode();
+        destIDTree.setNames(destNames);
+        destStructTree.setIDTree(destIDTree);
+    }
+
     // PDNameTreeNode.getNames() only brings one level, this is why we need this
     static Map<String, PDStructureElement> getIDTreeAsMap(PDNameTreeNode<PDStructureElement> idTree)
             throws IOException