You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ja...@apache.org on 2014/10/22 03:28:05 UTC

svn commit: r1633506 - in /pdfbox/trunk: examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ pdfbox/src/main/java/org/apache/pdfbox/pdmodel/ pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/destination/ pdfbox/src/ma...

Author: jahewson
Date: Wed Oct 22 01:28:04 2014
New Revision: 1633506

URL: http://svn.apache.org/r1633506
Log:
PDFBOX-2423: Clean up PDPageNode

Modified:
    pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/RubberStamp.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocumentCatalog.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageNode.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageDestination.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFTextStripper.java

Modified: pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/RubberStamp.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/RubberStamp.java?rev=1633506&r1=1633505&r2=1633506&view=diff
==============================================================================
--- pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/RubberStamp.java (original)
+++ pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/RubberStamp.java Wed Oct 22 01:28:04 2014
@@ -61,12 +61,11 @@ public class RubberStamp
                 {
                     throw new IOException( "Encrypted documents are not supported for this example" );
                 }
-                List allpages = new ArrayList();
-                document.getDocumentCatalog().getPages().getAllKids(allpages);
+                List<PDPage> allpages = document.getDocumentCatalog().getPages().getAllKids();
 
                 for (int i=0; i < allpages.size(); i++)
                 {
-                    PDPage apage = (PDPage) allpages.get(i);
+                    PDPage apage = allpages.get(i);
                     List annotations = apage.getAnnotations();
 
                     PDAnnotationRubberStamp rs = new PDAnnotationRubberStamp();

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java?rev=1633506&r1=1633505&r2=1633506&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java Wed Oct 22 01:28:04 2014
@@ -285,8 +285,7 @@ public class PDDocument implements Close
         // Get the first page
         PDDocumentCatalog root = getDocumentCatalog();
         PDPageNode rootPages = root.getPages();
-        List<PDPage> kids = new ArrayList<PDPage>();
-        rootPages.getAllKids(kids);
+        List<PDPage> kids = rootPages.getAllKids();
 
         int size = (int) rootPages.getCount();
         PDPage page;

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=1633506&r1=1633505&r2=1633506&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 Wed Oct 22 01:28:04 2014
@@ -55,7 +55,7 @@ public class PDDocumentCatalog implement
     private PDAcroForm cachedAcroForm;
 
     /**
-     * Constructor.
+     * Constructor. AcroForm.
      *
      * @param doc The document that this catalog is part of.
      */
@@ -133,14 +133,9 @@ public class PDDocumentCatalog implement
      *
      * @return A list of PDPage objects.
      */
-    public List getAllPages()
+    public List<PDPage> getAllPages()
     {
-        List retval = new ArrayList();
-        PDPageNode rootNode = getPages();
-        //old (slower):
-        //getPageObjects(rootNode, retval);
-        rootNode.getAllKids(retval);
-        return retval;
+        return getPages().getAllKids();
     }
 
     /**

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageNode.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageNode.java?rev=1633506&r1=1633505&r2=1633506&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageNode.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageNode.java Wed Oct 22 01:28:04 2014
@@ -16,8 +16,6 @@
  */
 package org.apache.pdfbox.pdmodel;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDictionary;
@@ -31,7 +29,6 @@ import org.apache.pdfbox.pdmodel.common.
 
 import java.util.ArrayList;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -42,13 +39,10 @@ import java.util.List;
  */
 public class PDPageNode implements COSObjectable
 {
-    private static final Log log = LogFactory.getLog(PDPageNode.class);
-
-    private COSDictionary node;
+    private final COSDictionary node;
 
     /**
-     * Creates a new instance of PDPage.
-     * Creates a new instance of PDPage.
+     * Constructor for embedding.
      */
     public PDPageNode()
     {
@@ -59,20 +53,19 @@ public class PDPageNode implements COSOb
     }
 
     /**
-     * Creates a new instance of PDPage.
+     * Constructor for reading.
      *
      * @param pages The dictionary pages.
      */
-    public PDPageNode( COSDictionary pages )
+    public PDPageNode(COSDictionary pages)
     {
         node = pages;
     }
 
     /**
-     * This will update the count attribute of the page node.  This only needs to
-     * be called if you add or remove pages.  The PDDocument will call this for you
-     * when you use the PDDocumnet persistence methods.  So, basically most clients
-     * will never need to call this.
+     * This will update the count attribute of the page node.  This only needs to be called if you
+     * add or remove pages.  The PDDocument will call this for you  when you use the PDDocumnet
+     * persistence methods.  So, basically most clients will never need to call this.
      *
      * @return The update count for this node.
      */
@@ -80,17 +73,15 @@ public class PDPageNode implements COSOb
     {
         long totalCount = 0;
         List kids = getKids();
-        Iterator kidIter = kids.iterator();
-        while( kidIter.hasNext() )
+        for (Object next : kids)
         {
-            Object next = kidIter.next();
-            if( next instanceof PDPage )
+            if (next instanceof PDPage)
             {
                 totalCount++;
             }
             else
             {
-                PDPageNode node = (PDPageNode)next;
+                PDPageNode node = (PDPageNode) next;
                 totalCount += node.updateCount();
             }
         }
@@ -105,12 +96,12 @@ public class PDPageNode implements COSOb
      */
     public long getCount()
     {
-        if(node == null)
+        if (node == null)
         {
             return 0L;
         }
         COSBase num = node.getDictionaryObject(COSName.COUNT);
-        if(num == null)
+        if (num == null)
         {
             return 0L;
         }
@@ -134,13 +125,12 @@ public class PDPageNode implements COSOb
      */
     public PDPageNode getParent()
     {
-        PDPageNode parent = null;
-        COSDictionary parentDic = (COSDictionary) node.getDictionaryObject(COSName.PARENT, COSName.P);
-        if( parentDic != null )
+        COSDictionary parent = (COSDictionary) node.getDictionaryObject(COSName.PARENT, COSName.P);
+        if (parent != null)
         {
-            parent = new PDPageNode( parentDic );
+            return new PDPageNode(parent);
         }
-        return parent;
+        return null;
     }
 
     /**
@@ -148,7 +138,7 @@ public class PDPageNode implements COSOb
      *
      * @param parent The parent to this page node.
      */
-    public void setParent( PDPageNode parent )
+    public void setParent(PDPageNode parent)
     {
         node.setItem(COSName.PARENT, parent.getDictionary());
     }
@@ -168,51 +158,51 @@ public class PDPageNode implements COSOb
     {
         List actuals = new ArrayList();
         COSArray kids = getAllKids(actuals, node, false);
-        return new COSArrayList( actuals, kids );
+        return new COSArrayList(actuals, kids);
     }
 
     /**
      * This will return all kids of this node as PDPage.
-     *
-     * @param result All direct and indirect descendants of this node are added to this list.
      */
-    public void getAllKids(List result)
+    public List<PDPage> getAllKids()
     {
-        getAllKids(result, node, true);
+        List<PDPage> result = new ArrayList<PDPage>();
+        getAllKids(result, node, true); // includes only PDPage
+        return result;
     }
 
     /**
      * This will return all kids of the given page node as PDPage.
      *
-     * @param result All direct and optionally indirect descendants of this node are added to this list.
+     * @param result Direct and optionally indirect descendants of this node are added to this list.
      * @param page Page dictionary of a page node.
      * @param recurse if true indirect descendants are processed recursively
      */
     private static COSArray getAllKids(List result, COSDictionary page, boolean recurse)
     {
-        if( page == null )
+        if (page == null)
         {
             return null;
         }
-        COSArray kids = (COSArray)page.getDictionaryObject( COSName.KIDS );
-        if( kids == null)
+        COSArray kids = (COSArray)page.getDictionaryObject(COSName.KIDS);
+        if (kids == null)
         {
-            log.error("No Kids found in getAllKids(). Probably a malformed pdf.");
+            // probably a malformed PDF
             return null;
         }
         HashSet<COSBase> seen = new HashSet<COSBase>();
-        for( int i=0; i<kids.size(); i++ )
+        for (int i = 0; i < kids.size(); i++)
         {
             // ignore duplicates (from malformed PDFs)
             if (!seen.contains(kids.get(i)))
             {
-                COSBase obj = kids.getObject( i );
+                COSBase obj = kids.getObject(i);
                 if (obj instanceof COSDictionary)
                 {
                     COSDictionary kid = (COSDictionary)obj;
-                    if( COSName.PAGE.equals( kid.getDictionaryObject( COSName.TYPE ) ) )
+                    if (COSName.PAGE.equals(kid.getDictionaryObject(COSName.TYPE)))
                     {
-                        result.add( new PDPage( kid ) );
+                        result.add(new PDPage(kid));
                     }
                     else
                     {
@@ -222,7 +212,7 @@ public class PDPageNode implements COSOb
                         }
                         else
                         {
-                            result.add( new PDPageNode( kid ) );
+                            result.add(new PDPageNode(kid));
                         }
                     }
                 }
@@ -233,19 +223,19 @@ public class PDPageNode implements COSOb
     }
 
     /**
-     * This will get the resources at this page node and not look up the hierarchy.
-     * This attribute is inheritable, and findResources() should probably used.
-     * This will return null if no resources are available at this level.
+     * This will get the resources at this page node and not look up the hierarchy. This attribute
+     * is inheritable, and findResources() should probably used. This will return null if
+     * no resources are available at this level.
      *
      * @return The resources at this level in the hierarchy.
      */
     public PDResources getResources()
     {
         PDResources retval = null;
-        COSDictionary resources = (COSDictionary) node.getDictionaryObject( COSName.RESOURCES );
-        if( resources != null )
+        COSDictionary resources = (COSDictionary) node.getDictionaryObject(COSName.RESOURCES);
+        if (resources != null)
         {
-            retval = new PDResources( resources );
+            retval = new PDResources(resources);
         }
         return retval;
     }
@@ -260,7 +250,7 @@ public class PDPageNode implements COSOb
     {
         PDResources retval = getResources();
         PDPageNode parent = getParent();
-        if( retval == null && parent != null )
+        if (retval == null && parent != null)
         {
             retval = parent.findResources();
         }
@@ -272,9 +262,9 @@ public class PDPageNode implements COSOb
      *
      * @param resources The new resources for this page.
      */
-    public void setResources( PDResources resources )
+    public void setResources(PDResources resources)
     {
-        if( resources == null )
+        if (resources == null)
         {
             node.removeItem(COSName.RESOURCES);
         }
@@ -285,26 +275,25 @@ public class PDPageNode implements COSOb
     }
 
     /**
-     * This will get the MediaBox at this page and not look up the hierarchy.
-     * This attribute is inheritable, and findMediaBox() should probably used.
-     * This will return null if no MediaBox are available at this level.
+     * This will get the MediaBox at this page and not look up the hierarchy. This attribute is
+     * inheritable, and findMediaBox() should probably used. This will return null if no MediaBox
+     * are available at this level.
      *
      * @return The MediaBox at this level in the hierarchy.
      */
     public PDRectangle getMediaBox()
     {
         PDRectangle retval = null;
-        COSArray array = (COSArray) node.getDictionaryObject( COSName.MEDIA_BOX );
-        if( array != null )
+        COSArray array = (COSArray) node.getDictionaryObject(COSName.MEDIA_BOX);
+        if (array != null)
         {
-            retval = new PDRectangle( array );
+            retval = new PDRectangle(array);
         }
         return retval;
     }
 
     /**
-     * This will find the MediaBox for this page by looking up the hierarchy until
-     * it finds them.
+     * This will find the MediaBox for this page by looking up the hierarchy until it finds them.
      *
      * @return The MediaBox at this level in the hierarchy.
      */
@@ -312,7 +301,7 @@ public class PDPageNode implements COSOb
     {
         PDRectangle retval = getMediaBox();
         PDPageNode parent = getParent();
-        if( retval == null && parent != null )
+        if (retval == null && parent != null)
         {
             retval = parent.findMediaBox();
         }
@@ -324,9 +313,9 @@ public class PDPageNode implements COSOb
      *
      * @param mediaBox The new mediaBox for this page.
      */
-    public void setMediaBox( PDRectangle mediaBox )
+    public void setMediaBox(PDRectangle mediaBox)
     {
-        if( mediaBox == null )
+        if (mediaBox == null)
         {
             node.removeItem(COSName.MEDIA_BOX);
         }
@@ -337,26 +326,25 @@ public class PDPageNode implements COSOb
     }
 
     /**
-     * This will get the CropBox at this page and not look up the hierarchy.
-     * This attribute is inheritable, and findCropBox() should probably used.
-     * This will return null if no CropBox is available at this level.
+     * This will get the CropBox at this page and not look up the hierarchy. This attribute is
+     * inheritable, and findCropBox() should probably used. This will return null if no CropBox is
+     * available at this level.
      *
      * @return The CropBox at this level in the hierarchy.
      */
     public PDRectangle getCropBox()
     {
         PDRectangle retval = null;
-        COSArray array = (COSArray) node.getDictionaryObject( COSName.CROP_BOX );
-        if( array != null )
+        COSArray array = (COSArray) node.getDictionaryObject(COSName.CROP_BOX);
+        if (array != null)
         {
-            retval = new PDRectangle( array );
+            retval = new PDRectangle(array);
         }
         return retval;
     }
 
     /**
-     * This will find the CropBox for this page by looking up the hierarchy until
-     * it finds them.
+     * This will find the CropBox for this page by looking up the hierarchy until  it finds them.
      *
      * @return The CropBox at this level in the hierarchy.
      */
@@ -364,13 +352,13 @@ public class PDPageNode implements COSOb
     {
         PDRectangle retval = getCropBox();
         PDPageNode parent = getParent();
-        if( retval == null && parent != null )
+        if (retval == null && parent != null)
         {
-            retval = findParentCropBox( parent );
+            retval = findParentCropBox(parent);
         }
 
         //default value for cropbox is the media box
-        if( retval == null )
+        if (retval == null)
         {
             retval = findMediaBox();
         }
@@ -378,18 +366,18 @@ public class PDPageNode implements COSOb
     }
 
     /**
-     * This will search for a crop box in the parent and return null if it is not
-     * found.  It will NOT default to the media box if it cannot be found.
+     * This will search for a crop box in the parent and return null if it is not found. It will NOT
+     * default to the media box if it cannot be found.
      *
      * @param node The node
      */
-    private PDRectangle findParentCropBox( PDPageNode node )
+    private PDRectangle findParentCropBox(PDPageNode node)
     {
         PDRectangle rect = node.getCropBox();
         PDPageNode parent = node.getParent();
-        if( rect == null && parent != null )
+        if (rect == null && parent != null)
         {
-            rect = findParentCropBox( node );
+            rect = findParentCropBox(node);
         }
         return rect;
     }
@@ -399,9 +387,9 @@ public class PDPageNode implements COSOb
      *
      * @param cropBox The new CropBox for this page.
      */
-    public void setCropBox( PDRectangle cropBox )
+    public void setCropBox(PDRectangle cropBox)
     {
-        if( cropBox == null )
+        if (cropBox == null)
         {
             node.removeItem(COSName.CROP_BOX);
         }
@@ -412,22 +400,21 @@ public class PDPageNode implements COSOb
     }
 
     /**
-     * A value representing the rotation.  This will be null if not set at this level
-     * The number of degrees by which the page should
-     * be rotated clockwise when displayed or printed. The value must be a multiple
-     * of 90.
-     *
-     * This will get the rotation at this page and not look up the hierarchy.
-     * This attribute is inheritable, and findRotation() should probably used.
-     * This will return null if no rotation is available at this level.
+     * A value representing the rotation.  This will be null if not set at this level. The number of
+     * degrees by which the page should  be rotated clockwise when displayed or printed. The value
+     * must be a multiple of 90.
+     *
+     * <p>This will get the rotation at this page and not look up the hierarchy. This attribute is
+     * inheritable, and findRotation() should probably used. This will return null if no rotation is
+     * available at this level.
      *
      * @return The rotation at this level in the hierarchy.
      */
     public Integer getRotation()
     {
         Integer retval = null;
-        COSNumber value = (COSNumber) node.getDictionaryObject( COSName.ROTATE );
-        if( value != null )
+        COSNumber value = (COSNumber) node.getDictionaryObject(COSName.ROTATE);
+        if (value != null)
         {
             retval = value.intValue();
         }
@@ -435,8 +422,7 @@ public class PDPageNode implements COSOb
     }
 
     /**
-     * This will find the rotation for this page by looking up the hierarchy until
-     * it finds them.
+     * This will find the rotation for this page by looking up the hierarchy until it finds them.
      *
      * @return The rotation at this level in the hierarchy.
      */
@@ -444,14 +430,14 @@ public class PDPageNode implements COSOb
     {
         int retval = 0;
         Integer rotation = getRotation();
-        if( rotation != null )
+        if (rotation != null)
         {
             retval = rotation;
         }
         else
         {
             PDPageNode parent = getParent();
-            if( parent != null )
+            if (parent != null)
             {
                 retval = parent.findRotation();
             }
@@ -465,7 +451,7 @@ public class PDPageNode implements COSOb
      *
      * @param rotation The new rotation for this page.
      */
-    public void setRotation( int rotation )
+    public void setRotation(int rotation)
     {
         node.setInt(COSName.ROTATE, rotation);
     }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageDestination.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageDestination.java?rev=1633506&r1=1633505&r2=1633506&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageDestination.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageDestination.java Wed Oct 22 01:28:04 2014
@@ -16,7 +16,6 @@
  */
 package org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.pdfbox.cos.COSArray;
@@ -140,8 +139,7 @@ public abstract class PDPageDestination 
                 }
                 // now parent is the pages node
                 PDPageNode pages = new PDPageNode((COSDictionary) parent);
-                List<PDPage> allPages = new ArrayList<PDPage>();
-                pages.getAllKids(allPages);
+                List<PDPage> allPages = pages.getAllKids();
                 retval = allPages.indexOf(new PDPage((COSDictionary) page)) + 1;
             }
         }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFTextStripper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFTextStripper.java?rev=1633506&r1=1633505&r2=1633506&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFTextStripper.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFTextStripper.java Wed Oct 22 01:28:04 2014
@@ -281,7 +281,7 @@ public class PDFTextStripper extends PDF
      *
      * @throws IOException If there is an error parsing the text.
      */
-    protected void processPages(List<COSObjectable> pages) throws IOException
+    protected void processPages(List<PDPage> pages) throws IOException
     {
         if (startBookmark != null)
         {
@@ -315,8 +315,7 @@ public class PDFTextStripper extends PDF
         }
     }
 
-    private int getPageNumber(PDOutlineItem bookmark, List<COSObjectable> allPages)
-            throws IOException
+    private int getPageNumber(PDOutlineItem bookmark, List<PDPage> allPages) throws IOException
     {
         int pageNumber = -1;
         PDPage page = bookmark.findDestinationPage(document);