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 2016/01/26 20:19:09 UTC

svn commit: r1726854 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageContentStream.java

Author: tilman
Date: Tue Jan 26 19:19:09 2016
New Revision: 1726854

URL: http://svn.apache.org/viewvc?rev=1726854&view=rev
Log:
PDFBOX-3084: more generic PDPageContentStream constructors, as suggested by Michael Klink and Philip Helger; DRY refactoring by Philip Helger

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageContentStream.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageContentStream.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageContentStream.java?rev=1726854&r1=1726853&r2=1726854&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageContentStream.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageContentStream.java Tue Jan 26 19:19:09 2016
@@ -61,6 +61,36 @@ import org.apache.pdfbox.util.Matrix;
  */
 public final class PDPageContentStream implements Closeable
 {
+    
+    /**
+     * This is to choose what to do with the stream: overwrite, append or prepend.
+     */
+    public static enum AppendMode
+    {
+        /**
+         * Overwrite the existing page content streams.
+         */
+        OVERWRITE, 
+        /**
+         * Append the content stream after all existing page content streams.
+         */
+        APPEND, 
+        /**
+         * Insert before all other page content streams.
+         */
+        PREPEND;
+
+        public boolean isOverwrite()
+        {
+            return this == OVERWRITE;
+        }
+
+        public boolean isPrepend()
+        {
+            return this == PREPEND;
+        }
+    }
+  
     private static final Log LOG = LogFactory.getLog(PDPageContentStream.class);
 
     private final PDDocument document;
@@ -85,7 +115,7 @@ public final class PDPageContentStream i
      */
     public PDPageContentStream(PDDocument document, PDPage sourcePage) throws IOException
     {
-        this(document, sourcePage, false, true);
+        this(document, sourcePage, AppendMode.OVERWRITE, true, false);
     }
 
     /**
@@ -97,7 +127,9 @@ public final class PDPageContentStream i
      *                      content is deleted.
      * @param compress Tell if the content stream should compress the page contents.
      * @throws IOException If there is an error writing to the page contents.
+     * @deprecated use {@link #PDPageContentStream(PDDocument, PDPage, PDPageContentStream.AppendMode, boolean)}
      */
+    @Deprecated
     public PDPageContentStream(PDDocument document, PDPage sourcePage, boolean appendContent,
                                boolean compress) throws IOException
     {
@@ -109,20 +141,54 @@ public final class PDPageContentStream i
      *
      * @param document The document the page is part of.
      * @param sourcePage The page to write the contents to.
+     * @param appendContent Indicates whether content will be overwritten, appended or prepended.
+     * @param compress Tell if the content stream should compress the page contents.
+     * @throws IOException If there is an error writing to the page contents.
+     */
+    public PDPageContentStream(PDDocument document, PDPage sourcePage, AppendMode appendContent,
+                               boolean compress) throws IOException
+    {
+        this(document, sourcePage, appendContent, compress, false);
+    }
+
+    /**
+     * Create a new PDPage content stream.
+     *
+     * @param document The document the page is part of.
+     * @param sourcePage The page to write the contents to.
      * @param appendContent Indicates whether content will be overwritten. If false all previous
      *                      content is deleted.
      * @param compress Tell if the content stream should compress the page contents.
      * @param resetContext Tell if the graphic context should be reseted.
      * @throws IOException If there is an error writing to the page contents.
+     * @deprecated use {@link #PDPageContentStream(PDDocument, PDPage, PDPageContentStream.AppendMode, boolean, boolean) }
      */
+    @Deprecated
     public PDPageContentStream(PDDocument document, PDPage sourcePage, boolean appendContent,
                                boolean compress, boolean resetContext) throws IOException
     {
+      this (document, sourcePage, appendContent ? AppendMode.APPEND : AppendMode.OVERWRITE, compress, resetContext);
+    }
+    
+    /**
+     * Create a new PDPage content stream.
+     *
+     * @param document The document the page is part of.
+     * @param sourcePage The page to write the contents to.
+     * @param appendContent Indicates whether content will be overwritten, appended or prepended.
+     * @param compress Tell if the content stream should compress the page contents.
+     * @param resetContext Tell if the graphic context should be reset. This is only relevant
+     *                     in non-overwrite modes.
+     * @throws IOException If there is an error writing to the page contents.
+     */
+    public PDPageContentStream(PDDocument document, PDPage sourcePage, AppendMode appendContent,
+                               boolean compress, boolean resetContext) throws IOException
+    {
         this.document = document;
         COSName filter = compress ? COSName.FLATE_DECODE : null;
         
-        // If request specifies the need to append to the document
-        if (appendContent && sourcePage.hasContents())
+        // If request specifies the need to append/prepend to the document
+        if (!appendContent.isOverwrite() && sourcePage.hasContents())
         {
             // Create a stream to append new content
             PDStream contentsToAppend = new PDStream(document);
@@ -133,14 +199,20 @@ public final class PDPageContentStream i
             if (contents instanceof COSArray)
             {
                 // If contents is already an array, a new stream is simply appended to it
-                array = (COSArray)contents;
-                array.add(contentsToAppend);
+                array = (COSArray) contents;
             }
             else
             {
                 // Creates a new array and adds the current stream plus a new one to it
                 array = new COSArray();
                 array.add(contents);
+            }
+            if (appendContent.isPrepend())
+            {
+                array.add(0, contentsToAppend.getCOSObject());
+            }
+            else
+            {
                 array.add(contentsToAppend);
             }
 
@@ -203,13 +275,7 @@ public final class PDPageContentStream i
      */
     public PDPageContentStream(PDDocument doc, PDAppearanceStream appearance) throws IOException
     {
-        this.document = doc;
-        
-        output = appearance.getStream().createOutputStream();
-        this.resources = appearance.getResources();
-        
-        formatDecimal.setMaximumFractionDigits(4);
-        formatDecimal.setGroupingUsed(false);
+        this (doc, appearance, appearance.getStream().createOutputStream()); 
     }
     
     /**