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 2015/05/12 19:00:26 UTC

svn commit: r1679003 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: multipdf/ pdmodel/ pdmodel/interactive/documentnavigation/outline/

Author: tilman
Date: Tue May 12 17:00:26 2015
New Revision: 1679003

URL: http://svn.apache.org/r1679003
Log:
PDFBOX-2793: add support of /Dests directory in /Catalog for name lookup in outline item and in merge

Added:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocumentNameDestinationDictionary.java   (with props)
Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocumentCatalog.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItem.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java?rev=1679003&r1=1679002&r2=1679003&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java Tue May 12 17:00:26 2015
@@ -39,6 +39,7 @@ import org.apache.pdfbox.cos.COSString;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
 import org.apache.pdfbox.pdmodel.PDDocumentInformation;
+import org.apache.pdfbox.pdmodel.PDDocumentNameDestinationDictionary;
 import org.apache.pdfbox.pdmodel.PDDocumentNameDictionary;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDResources;
@@ -323,6 +324,20 @@ public class PDFMergerUtility
                 cloner.cloneMerge(srcNames, destNames);
             }
         }
+        
+        PDDocumentNameDestinationDictionary destDests = destCatalog.getDests();
+        PDDocumentNameDestinationDictionary srcDests = srcCatalog.getDests();
+        if (srcDests != null)
+        {
+            if (destDests == null)
+            {
+                destCatalog.getCOSObject().setItem(COSName.DESTS, cloner.cloneForNewDocument(srcDests));
+            }
+            else
+            {
+                cloner.cloneMerge(srcDests, destDests);
+            }
+        }
 
         PDDocumentOutline destOutline = destCatalog.getDocumentOutline();
         PDDocumentOutline srcOutline = srcCatalog.getDocumentOutline();

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocumentCatalog.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocumentCatalog.java?rev=1679003&r1=1679002&r2=1679003&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocumentCatalog.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocumentCatalog.java Tue May 12 17:00:26 2015
@@ -293,6 +293,20 @@ public class PDDocumentCatalog implement
     }
 
     /**
+     * @return The named destinations dictionary for this document or null if none exists.
+     */
+    public PDDocumentNameDestinationDictionary getDests()
+    {
+        PDDocumentNameDestinationDictionary nameDic = null;
+        COSDictionary dests = (COSDictionary) root.getDictionaryObject(COSName.DESTS);
+        if (dests != null)
+        {
+            nameDic = new PDDocumentNameDestinationDictionary(dests);
+        }
+        return nameDic;
+    }
+    
+    /**
      * Sets the names dictionary for the document.
      *
      * @param names The names dictionary that is associated with this document.

Added: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocumentNameDestinationDictionary.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocumentNameDestinationDictionary.java?rev=1679003&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocumentNameDestinationDictionary.java (added)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocumentNameDestinationDictionary.java Tue May 12 17:00:26 2015
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pdfbox.pdmodel;
+
+import java.io.IOException;
+import org.apache.pdfbox.cos.COSBase;
+import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.pdmodel.common.COSObjectable;
+import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDDestination;
+
+/**
+ * This encapsulates the "dictionary of names and corresponding destinations" for the /Dest entry in
+ * the document catalog.
+ *
+ * @author Tilman Hausherr
+ */
+public class PDDocumentNameDestinationDictionary implements COSObjectable
+{
+    private final COSDictionary nameDictionary;
+
+     /**
+     * Constructor.
+     *
+     * @param dict The dictionary of names and corresponding destinations.
+     */
+    public PDDocumentNameDestinationDictionary(COSDictionary dict)
+    {
+        this.nameDictionary = dict;
+    }
+
+    /**
+     * Convert this standard java object to a COS object.
+     *
+     * @return The cos dictionary for this object.
+     */
+    @Override
+    public COSDictionary getCOSObject()
+    {
+        return nameDictionary;
+    }
+    
+    /**
+     * Returns the destination corresponding to the parameter.
+     *
+     * @param name The destination name.
+     * @return The destination for that name, or null if there isn't any.
+     * 
+     * @throws IOException if something goes wrong when creating the destination object.
+     */
+    public PDDestination getDestination(String name) throws IOException
+    {
+        COSBase item = nameDictionary.getDictionaryObject(name);
+        return PDDestination.create(item);
+    }
+    
+
+}

Propchange: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocumentNameDestinationDictionary.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItem.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItem.java?rev=1679003&r1=1679002&r2=1679003&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItem.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItem.java Tue May 12 17:00:26 2015
@@ -25,6 +25,7 @@ import org.apache.pdfbox.cos.COSFloat;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.pdmodel.PDDestinationNameTreeNode;
 import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDDocumentNameDestinationDictionary;
 import org.apache.pdfbox.pdmodel.PDDocumentNameDictionary;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement;
@@ -236,13 +237,13 @@ public final class PDOutlineItem extends
             {
                 dest = ((PDActionGoTo)outlineAction).getDestination();
             }
-            else
-            {
-                return null;
-            }
+        }
+        if (dest == null)
+        {
+            return null;
         }
 
-        PDPageDestination pageDestination;
+        PDPageDestination pageDestination = null;
         if( dest instanceof PDNamedDestination )
         {
             //if we have a named destination we need to lookup the PDPageDestination
@@ -255,12 +256,18 @@ public final class PDOutlineItem extends
                 {
                     pageDestination = (PDPageDestination)destsTree.getValue( namedDest.getNamedDestination() );
                 }
-                else
+            }
+            if (pageDestination == null)
+            {
+                // Look up /Dests dictionary from catalog
+                PDDocumentNameDestinationDictionary nameDestDict = doc.getDocumentCatalog().getDests();
+                if (nameDestDict != null)
                 {
-                    return null;
+                    String name = namedDest.getNamedDestination();
+                    pageDestination = (PDPageDestination) nameDestDict.getDestination(name);
                 }
             }
-            else
+            if (pageDestination == null)
             {
                 return null;
             }
@@ -269,10 +276,6 @@ public final class PDOutlineItem extends
         {
             pageDestination = (PDPageDestination) dest;
         }
-        else if( dest == null )
-        {
-            return null;
-        }
         else
         {
             throw new IOException( "Error: Unknown destination type " + dest );