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 2026/10/17 04:04:26 UTC

svn commit: r1939176 - pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf

Author: tilman
Date: Sat Oct 17 04:04:26 2026
New Revision: 1939176

Log:
PDFBOX-6283: fix destinations in catalog names dict

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

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Splitter.java
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Splitter.java	Sat Oct 17 02:45:35 2026	(r1939175)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/Splitter.java	Sat Oct 17 04:04:26 2026	(r1939176)
@@ -35,8 +35,11 @@ import org.apache.pdfbox.cos.COSInteger;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSObject;
 import org.apache.pdfbox.io.MemoryUsageSetting;
+import org.apache.pdfbox.pdmodel.PDDestinationNameTreeNode;
 import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
 import org.apache.pdfbox.pdmodel.PDDocumentInformation;
+import org.apache.pdfbox.pdmodel.PDDocumentNameDictionary;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDPageTree;
 import org.apache.pdfbox.pdmodel.PDResources;
@@ -822,6 +825,59 @@ public class Splitter
         processAnnotations(imported);
 
         pageDictMap.put(page.getCOSObject(), imported.getCOSObject());
+
+        //TODO this segment belongs within fixDestinations() using the pageDictMap
+        // this will prevent some multiple work
+        // Find named destinations that are in the destination document
+        PDDocumentNameDictionary names = sourceDocument.getDocumentCatalog().getNames();
+        if (names != null)
+        {
+            PDDestinationNameTreeNode dests = names.getDests();
+            if (dests != null)
+            {
+                Map<String, PDPageDestination> srcTreeAsMap = dests.getTreeAsMap();
+
+                // create destination structure if needed (may have been done for a previous page)
+                PDDocumentCatalog dstDocumentCatalog = getDestinationDocument().getDocumentCatalog();
+                PDDocumentNameDictionary dstNames = dstDocumentCatalog.getNames();
+                if (dstNames == null)
+                {
+                    dstNames = new PDDocumentNameDictionary(dstDocumentCatalog);
+                }
+                PDDestinationNameTreeNode dstDests = dstNames.getDests();
+                if (dstDests == null)
+                {
+                    dstDests = new PDDestinationNameTreeNode();
+                }
+                Map<String, PDPageDestination> dstTreeAsMap = dstDests.getTreeAsMap();
+                
+                for (Map.Entry<String, PDPageDestination> entry : srcTreeAsMap.entrySet())
+                {
+                    PDPageDestination value = entry.getValue();
+                    PDPage pageInTreeDest = value.getPage();
+                    if (page.equals(pageInTreeDest))
+                    {
+                        // clone destination
+                        COSArray clonedDestinationArray = new COSArray();
+                        COSArray srcDestinationArray = ((PDPageDestination) value).getCOSObject();
+                        for (int i = 0; i < srcDestinationArray.size(); ++i)
+                        {
+                            clonedDestinationArray.add(srcDestinationArray.getObject(i));
+                        }                        
+                        PDPageDestination dstDestination =
+                                (PDPageDestination) PDDestination.create(clonedDestinationArray);
+                        dstDestination.setPage(imported);
+                        dstTreeAsMap.put(entry.getKey(), dstDestination);
+                    }
+                }
+                if (!dstTreeAsMap.isEmpty())
+                {
+                    dstDests.setNames(dstTreeAsMap);
+                    dstNames.setDests(dstDests);
+                    dstDocumentCatalog.setNames(dstNames);
+                }
+            }
+        }
     }
 
     /**