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 );