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 11:56:46 UTC
svn commit: r1939183 - pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/multipdf
Author: tilman
Date: Sat Oct 17 11:56:46 2026
New Revision: 1939183
Log:
PDFBOX-6283: add test by Simon Steiner
Modified:
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java
Modified: pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java Sat Oct 17 11:56:43 2026 (r1939182)
+++ pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java Sat Oct 17 11:56:46 2026 (r1939183)
@@ -27,6 +27,7 @@ import java.io.OutputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -44,8 +45,10 @@ 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.PDDocumentNameDictionary;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageTree;
import org.apache.pdfbox.pdmodel.PDResources;
@@ -1598,4 +1601,61 @@ public class PDFMergerUtilityTest extend
assertEquals(233, bim.getHeight());
mergedDoc.close();
}
+
+ /**
+ * PDFBOX-6283: Verifies that named destinations (/Names /Dests) pointing to a page are copied
+ * to the split document that contains that page, remapped to the imported page, and that
+ * destinations pointing to other pages are not carried over.
+ */
+ public void testSplitCopiesNamedDestinations() throws Exception
+ {
+ PDDocument document = new PDDocument();
+ PDPage page0 = new PDPage();
+ PDPage page1 = new PDPage();
+ PDPage page2 = new PDPage();
+ document.addPage(page0);
+ document.addPage(page1);
+ document.addPage(page2);
+
+ PDPageFitDestination dest0 = new PDPageFitDestination();
+ dest0.setPage(page0);
+ PDPageFitDestination dest1 = new PDPageFitDestination();
+ dest1.setPage(page1);
+ PDPageFitDestination dest2 = new PDPageFitDestination();
+ dest2.setPage(page2);
+
+ Map<String, PDPageDestination> destNames = new LinkedHashMap<String, PDPageDestination>();
+ destNames.put("dest0", dest0);
+ destNames.put("dest1", dest1);
+ destNames.put("dest2", dest2);
+
+ PDDocumentNameDictionary names = new PDDocumentNameDictionary(document.getDocumentCatalog());
+ PDDestinationNameTreeNode dests = new PDDestinationNameTreeNode();
+ dests.setNames(destNames);
+ names.setDests(dests);
+ document.getDocumentCatalog().setNames(names);
+
+ List<PDDocument> split = new Splitter().split(document);
+ assertEquals(3, split.size());
+
+ for (int i = 0; i < split.size(); i++)
+ {
+ PDDocument splitDocument = split.get(i);
+ PDDocumentNameDictionary splitNames = splitDocument.getDocumentCatalog().getNames();
+ assertNotNull("split document " + i + " should have a name dictionary", splitNames);
+ assertNotNull("split document " + i + " should have a dests node", splitNames.getDests());
+
+ Map<String, PDPageDestination> copiedNames = splitNames.getDests().getNames();
+ assertNotNull(copiedNames);
+ // only the destination pointing to this page should be present
+ assertEquals(1, copiedNames.size());
+
+ String expectedName = "dest" + i;
+ COSObjectable copied = copiedNames.get(expectedName);
+ assertTrue(copied instanceof PDPageFitDestination);
+ // the destination must point to the imported page of the split document
+ PDPage importedPage = ((PDPageFitDestination) copied).getPage();
+ assertSame(splitDocument.getPage(0).getCOSObject(), importedPage.getCOSObject());
+ }
+ }
}