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 2017/11/09 17:25:47 UTC

svn commit: r1814753 - /pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java

Author: tilman
Date: Thu Nov  9 17:25:47 2017
New Revision: 1814753

URL: http://svn.apache.org/viewvc?rev=1814753&view=rev
Log:
PDFBOX-3999: added test that pages referenced in the structure tree number tree are part of the page tree

Modified:
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java

Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java?rev=1814753&r1=1814752&r2=1814753&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java Thu Nov  9 17:25:47 2017
@@ -17,14 +17,25 @@ package org.apache.pdfbox.multipdf;
 
 import java.awt.image.BufferedImage;
 import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
 
 import junit.framework.TestCase;
+import org.apache.pdfbox.cos.COSArray;
+import org.apache.pdfbox.cos.COSBase;
+import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.cos.COSObject;
+import org.apache.pdfbox.io.IOUtils;
 
 import org.apache.pdfbox.io.MemoryUsageSetting;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
 import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.PDPageTree;
+import org.apache.pdfbox.pdmodel.common.PDNumberTreeNode;
 import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageDestination;
 import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageFitDestination;
 import org.apache.pdfbox.rendering.PDFRenderer;
@@ -156,6 +167,65 @@ public class PDFMergerUtilityTest extend
         }
     }
 
+    /**
+     * PDFBOX-3999: check that entries in the number tree only reference pages from the page tree.
+     * 
+     * @throws IOException 
+     */
+    public void testStructureTreeMerge() throws IOException
+    {
+        InputStream is;
+        try
+        {
+            System.out.println("Downloading GeneralForbearance.pdf...");
+            is = new URL("https://issues.apache.org/jira/secure/attachment/12896905/GeneralForbearance.pdf").openStream();
+            FileOutputStream fos = new FileOutputStream(new File("target", "GeneralForbearance.pdf"));
+            IOUtils.copy(is, fos);
+            is.close();
+            fos.close();
+            System.out.println("Download finished!");
+        }
+        catch (IOException ex)
+        {
+            System.err.println("GeneralForbearance.pdf could not be downloaded, test skipped");
+            return;
+        }
+        PDFMergerUtility pdfMergerUtility = new PDFMergerUtility();
+        PDDocument src = PDDocument.load(new File("target", "GeneralForbearance.pdf"));
+        PDDocument dst = PDDocument.load(new File("target", "GeneralForbearance.pdf"));
+        pdfMergerUtility.appendDocument(dst, src);
+        src.close(); //if we don't close the src then we don't have an error
+        dst.save(new File("target", "GovFormPreFlattened-merged.pdf"));
+        dst.close();
+
+        PDDocument doc = PDDocument.load(new File("target", "GovFormPreFlattened-merged.pdf"));
+        PDPageTree pageTree = doc.getPages();
+        PDNumberTreeNode parentTree = doc.getDocumentCatalog().getStructureTreeRoot().getParentTree();
+        COSArray numArray = (COSArray) parentTree.getCOSObject().getDictionaryObject(COSName.NUMS);
+        for (COSBase base : numArray)
+        {
+            if (base instanceof COSObject)
+            {
+                base = ((COSObject) base).getObject();
+            }
+            if (base instanceof COSArray)
+            {
+                for (COSBase base2 : (COSArray) base)
+                {
+                    if (base2 instanceof COSObject)
+                    {
+                        base2 = ((COSObject) base2).getObject();
+                    }
+                    checkForPage(pageTree, base2);
+                }
+            }
+            else if (base instanceof COSDictionary)
+            {
+                checkForPage(pageTree, base);
+            }
+        }
+    }
+
     // checks that the result file of a merge has the same rendering as the two source files
     private void checkMergeIdentical(String filename1, String filename2, String mergeFilename, 
             MemoryUsageSetting memUsageSetting)
@@ -227,4 +297,13 @@ public class PDFMergerUtilityTest extend
         }
     }
 
+    private void checkForPage(PDPageTree pageTree, COSBase base2)
+    {
+        COSDictionary dict = (COSDictionary) base2;
+        if (dict.containsKey(COSName.PG))
+        {
+            PDPage page = new PDPage((COSDictionary) dict.getDictionaryObject(COSName.PG));
+            assertTrue("Page is not in the page tree", pageTree.indexOf(page) != -1);
+        }
+    }
 }