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

svn commit: r1647281 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/Splitter.java

Author: lehmi
Date: Mon Dec 22 10:26:05 2014
New Revision: 1647281

URL: http://svn.apache.org/r1647281
Log:
PDFBOX-785: remove all pages within annotations to avoid the import of unneeded resources

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/Splitter.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/Splitter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/Splitter.java?rev=1647281&r1=1647280&r2=1647281&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/Splitter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/Splitter.java Mon Dec 22 10:26:05 2014
@@ -18,9 +18,12 @@ package org.apache.pdfbox.util;
 
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
+import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink;
+import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDDestination;
+import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageDestination;
 
 import java.io.IOException;
-
 import java.util.ArrayList;
 import java.util.List;
 
@@ -40,7 +43,7 @@ public class Splitter
     private int endPage = Integer.MAX_VALUE;
     private List<PDDocument> destinationDocuments;
 
-    private int pageNumber = 0;
+    private int currentPageNumber = 0;
 
     /**
      * This will take a document and split into several other documents.
@@ -61,8 +64,8 @@ public class Splitter
 
     /**
      * This will tell the splitting algorithm where to split the pages.  The default
-     * is 1, so every page will become a new document.  If it was to then each document would
-     * contain 2 pages.  So it the source document had 5 pages it would split into
+     * is 1, so every page will become a new document.  If it was two then each document would
+     * contain 2 pages.  If the source document had 5 pages it would split into
      * 3 new documents, 2 documents containing 2 pages and 1 document containing one
      * page.
      *
@@ -115,20 +118,20 @@ public class Splitter
         for (int i = 0; i < sourceDocument.getNumberOfPages(); i++)
         {
             PDPage page = sourceDocument.getPage(i);
-            if (pageNumber + 1 >= startPage && pageNumber + 1 <= endPage)
+            if (currentPageNumber + 1 >= startPage && currentPageNumber + 1 <= endPage)
             {
                 processPage(page);
-                pageNumber++;
+                currentPageNumber++;
             }
             else
             {
-                if (pageNumber > endPage)
+                if (currentPageNumber > endPage)
                 {
                     break;
                 }
                 else
                 {
-                    pageNumber++;
+                    currentPageNumber++;
                 }
             }
         }
@@ -141,7 +144,7 @@ public class Splitter
      */
     private void createNewDocumentIfNecessary() throws IOException
     {
-        if (splitAtPage(pageNumber) || currentDestinationDocument == null)
+        if (splitAtPage(currentPageNumber) || currentDestinationDocument == null)
         {
             currentDestinationDocument = createNewDocument();
             destinationDocuments.add(currentDestinationDocument);
@@ -159,7 +162,8 @@ public class Splitter
      *     return isPrime(pageNumber);
      * }
      * </code>
-     *
+     * @param pageNumber the page number to be checked as splitting page
+     * 
      * @return true If a new document should be created.
      */
     protected boolean splitAtPage(int pageNumber)
@@ -170,6 +174,7 @@ public class Splitter
     /**
      * Create a new document to write the split contents to.
      *
+     * @return the newly created PDDocument. 
      * @throws IOException If there is an problem creating the new document.
      */
     protected PDDocument createNewDocument() throws IOException
@@ -191,16 +196,43 @@ public class Splitter
     protected void processPage(PDPage page) throws IOException
     {
         createNewDocumentIfNecessary();
+        
         PDPage imported = getDestinationDocument().importPage(page);
         imported.setCropBox(page.getCropBox());
         imported.setMediaBox(page.getMediaBox());
         // only the resources of the page will be copied
         imported.setResources(page.getResources());
         imported.setRotation(page.getRotation());
+        // remove page links to avoid copying not needed resources 
+        processAnnotations(imported);
     }
 
+    private void processAnnotations(PDPage imported) throws IOException
+    {
+        List<PDAnnotation> annotations = imported.getAnnotations();
+        for (PDAnnotation annotation : annotations)
+        {
+            if (annotation instanceof PDAnnotationLink)
+            {
+                PDAnnotationLink link = (PDAnnotationLink)annotation;   
+                PDDestination destination = link.getDestination();
+                if (destination instanceof PDPageDestination)
+                {
+                    // TODO preserve links to pages within the splitted result  
+                    link.setDestination(null);
+                }
+            }
+            else
+            {
+                // TODO preserve links to pages within the splitted result  
+                annotation.setPage(null);
+            }
+        }
+    }
     /**
      * The source PDF document.
+     * 
+     * @return the pdf to be splitted
      */
     protected final PDDocument getSourceDocument()
     {
@@ -209,6 +241,8 @@ public class Splitter
 
     /**
      * The source PDF document.
+     * 
+     * @return current destination pdf
      */
     protected final PDDocument getDestinationDocument()
     {