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 04:09:12 UTC

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

Author: tilman
Date: Sun Dec 30 04:09:12 2018
New Revision: 1849950

URL: http://svn.apache.org/viewvc?rev=1849950&view=rev
Log:
PDFBOX-4417: merge /K entries depending on whether they are COSArray or COSDictionary - this solves the double /StructTreeRoot problem

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=1849950&r1=1849949&r2=1849950&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 04:09:12 2018
@@ -811,25 +811,49 @@ public class PDFMergerUtility
             destStructTree.setParentTree(newParentTreeNode);
             destStructTree.setParentTreeNextKey(destParentTreeNextKey);
 
-            COSArray newKArray = new COSArray();
-            if (srcStructTree.getK() != null)
+            mergeKEntries(cloner, srcStructTree, destStructTree);
+            mergeRoleMap(srcStructTree, destStructTree);
+        }
+    }
+
+    private void mergeKEntries(PDFCloneUtility cloner,
+                      PDStructureTreeRoot srcStructTree,
+                      PDStructureTreeRoot destStructTree) throws IOException
+    {
+        // make new /K with array that has the input /K entries
+        COSArray newKArray = new COSArray();
+        if (srcStructTree.getK() != null)
+        {
+            COSBase base = cloner.cloneForNewDocument(srcStructTree.getK());
+            if (base instanceof COSArray)
+            {
+                newKArray.addAll((COSArray) base);
+            }
+            else
             {
-                newKArray.add(cloner.cloneForNewDocument(srcStructTree.getK()));
+                newKArray.add(base);
             }
-            if (destStructTree.getK() != null)
+        }
+        if (destStructTree.getK() != null)
+        {
+            COSBase base = destStructTree.getK();
+            if (base instanceof COSArray)
             {
-                newKArray.add(destStructTree.getK());
+                newKArray.addAll((COSArray) base);
             }
-            if (newKArray.size() > 0)
+            else
             {
-                COSDictionary kDictLevel0 = new COSDictionary();
-                kDictLevel0.setItem(COSName.K, newKArray);
-                kDictLevel0.setItem(COSName.P, destStructTree);
-                kDictLevel0.setItem(COSName.S, COSName.DOCUMENT);
-                destStructTree.setK(kDictLevel0);
+                newKArray.add(base);
             }
-
-            mergeRoleMap(srcStructTree, destStructTree);
+        }
+        if (newKArray.size() > 0)
+        {
+            COSDictionary kDictLevel0 = new COSDictionary();
+            updateParentEntry(newKArray, kDictLevel0);
+            kDictLevel0.setItem(COSName.K, newKArray);
+            kDictLevel0.setItem(COSName.P, destStructTree);
+            kDictLevel0.setItem(COSName.S, COSName.DOCUMENT);
+            destStructTree.setK(kDictLevel0);
         }
     }