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 2015/05/05 02:14:36 UTC

svn commit: r1677712 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel: PDPageContentStream.java interactive/form/AppearanceGeneratorHelper.java interactive/form/AppearancePrimitivesComposer.java interactive/form/PlainTextFormatter.java

Author: jahewson
Date: Tue May  5 00:14:35 2015
New Revision: 1677712

URL: http://svn.apache.org/r1677712
Log:
PDFBOX-2333: Replace AppearancePrimitivesComposer with PDPageContentStream

Removed:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearancePrimitivesComposer.java
Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageContentStream.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainTextFormatter.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=1677712&r1=1677711&r2=1677712&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 May  5 00:14:35 2015
@@ -53,6 +53,7 @@ import org.apache.pdfbox.pdmodel.graphic
 import org.apache.pdfbox.pdmodel.graphics.image.PDInlineImage;
 import org.apache.pdfbox.pdmodel.graphics.shading.PDShading;
 import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
+import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream;
 import org.apache.pdfbox.util.Charsets;
 import org.apache.pdfbox.util.Matrix;
 
@@ -211,6 +212,24 @@ public final class PDPageContentStream i
     }
 
     /**
+     * Create a new appearance stream. Note that this is not actually a "page" content stream.
+     *
+     * @param doc The document the page is part of.
+     * @param appearance The appearance stream to write to.
+     * @throws IOException If there is an error writing to the page contents.
+     */
+    public PDPageContentStream(PDDocument doc, PDAppearanceStream appearance) throws IOException
+    {
+        this.document = doc;
+        
+        output = appearance.getPDStream().createOutputStream();
+        this.resources = appearance.getResources();
+        
+        formatDecimal.setMaximumFractionDigits(10);
+        formatDecimal.setGroupingUsed(false);
+    }
+
+    /**
      * Begin some text operations.
      *
      * @throws IOException If there is an error writing to the stream or if you attempt to

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java?rev=1677712&r1=1677711&r2=1677712&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java Tue May  5 00:14:35 2015
@@ -30,6 +30,7 @@ import org.apache.pdfbox.cos.COSNumber;
 import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.pdfparser.PDFStreamParser;
 import org.apache.pdfbox.pdfwriter.ContentStreamWriter;
+import org.apache.pdfbox.pdmodel.PDPageContentStream;
 import org.apache.pdfbox.pdmodel.PDResources;
 import org.apache.pdfbox.pdmodel.common.COSObjectable;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
@@ -225,7 +226,7 @@ class AppearanceGeneratorHelper
         writer.writeTokens(tokens);
         output.write("/Tx BMC\n".getBytes("ISO-8859-1"));
         PDRectangle boundingBox = resolveBoundingBox(widget, appearanceStream);
-        insertGeneratedAppearance(boundingBox, output, pdFont, tokens);
+        insertGeneratedAppearance(boundingBox, output, pdFont, tokens, appearanceStream);
         output.write("EMC".getBytes("ISO-8859-1"));
         output.close();
         writeToStream(output.toByteArray(), appearanceStream);
@@ -249,7 +250,7 @@ class AppearanceGeneratorHelper
 
         output.write("\n".getBytes("ISO-8859-1"));
         
-        insertGeneratedAppearance(boundingBox, output, pdFont, tokens);
+        insertGeneratedAppearance(boundingBox, output, pdFont, tokens, appearanceStream);
 
         if (emcIndex != -1)
         {
@@ -263,11 +264,11 @@ class AppearanceGeneratorHelper
      * Generate and insert text content and clipping around it.   
      */
     private void insertGeneratedAppearance(PDRectangle boundingBox, OutputStream output,
-            PDFont font, List<Object> tokens)
+            PDFont font, List<Object> tokens, PDAppearanceStream appearanceStream)
             throws IOException
     {
-        AppearancePrimitivesComposer composer = new AppearancePrimitivesComposer(output);
-        float fontSize = 0.0f;
+        PDPageContentStream contents = new PDPageContentStream(acroForm.getDocument(),
+                                                               appearanceStream);
 
         // Acrobat calculates the left and right padding dependent on the offset of the border edge
         // This calculation works for forms having been generated by Acrobat.
@@ -277,14 +278,15 @@ class AppearanceGeneratorHelper
         PDRectangle contentEdge = applyPadding(paddingEdge,Math.max(1f, lineWidth));
         
         // add a clipping path to avoid overlapping with the border
-        composer.addRect(paddingEdge);
-        composer.clip();
+        contents.addRect(paddingEdge.getLowerLeftX(), paddingEdge.getLowerLeftY(),
+                         paddingEdge.getWidth(), paddingEdge.getHeight());
+        contents.clip();
         
         // start the text output
-        composer.beginText();
+        contents.beginText();
         
         // calculate the fontSize 
-        fontSize = calculateFontSize(font, contentEdge);
+        float fontSize = calculateFontSize(font, contentEdge);
         
         if (!defaultAppearanceHandler.getTokens().isEmpty())
         {
@@ -303,8 +305,9 @@ class AppearanceGeneratorHelper
         {
             // calculation of the horizontal offset from where the text will be printed
             leftOffset = calculateHorizontalOffset(contentEdge, font, fontSize);
-            composer.newLineAtOffset(leftOffset, verticalOffset);
-            composer.showText(value, font);
+            contents.newLineAtOffset(leftOffset, verticalOffset);
+            contents.setFont(font, fontSize);
+            contents.showText(value);
         }
         else
         {
@@ -314,11 +317,11 @@ class AppearanceGeneratorHelper
             appearanceStyle.setFont(font);
             appearanceStyle.setFontSize(fontSize);
             
-            //Adobe Acrobat uses the font's bounding box for the leading between the lines
+            // Adobe Acrobat uses the font's bounding box for the leading between the lines
             appearanceStyle.setLeading(font.getBoundingBox().getHeight() / GLYPH_TO_PDF_SCALE * fontSize);
             
             PlainTextFormatter formatter = new PlainTextFormatter
-                                                .Builder(composer)
+                                                .Builder(contents)
                                                     .style(appearanceStyle)
                                                     .text(textContent)
                                                     .width(contentEdge.getWidth())
@@ -329,7 +332,8 @@ class AppearanceGeneratorHelper
             formatter.format();
 
         }
-        composer.endText();
+        contents.endText();
+        contents.close();
     }
 
     /*

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainTextFormatter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainTextFormatter.java?rev=1677712&r1=1677711&r2=1677712&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainTextFormatter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainTextFormatter.java Tue May  5 00:14:35 2015
@@ -19,6 +19,7 @@ package org.apache.pdfbox.pdmodel.intera
 import java.io.IOException;
 import java.util.List;
 
+import org.apache.pdfbox.pdmodel.PDPageContentStream;
 import org.apache.pdfbox.pdmodel.font.PDFont;
 import org.apache.pdfbox.pdmodel.interactive.form.PlainText.Line;
 import org.apache.pdfbox.pdmodel.interactive.form.PlainText.Paragraph;
@@ -68,7 +69,7 @@ class PlainTextFormatter
     private final boolean wrapLines;
     private final float width;
     
-    private final AppearancePrimitivesComposer composer;
+    private final PDPageContentStream contents;
     private final PlainText textContent;
     private final TextAlign textAlignment;
     
@@ -79,7 +80,7 @@ class PlainTextFormatter
     {
 
         // required parameters
-        private AppearancePrimitivesComposer composer;
+        private PDPageContentStream contents;
 
         // optional parameters
         private AppearanceStyle appearanceStyle;
@@ -93,9 +94,9 @@ class PlainTextFormatter
         private float horizontalOffset = 0f;
         private float verticalOffset = 0f;
         
-        public Builder(AppearancePrimitivesComposer composer)
+        public Builder(PDPageContentStream contents)
         {
-            this.composer = composer;
+            this.contents = contents;
         }
 
         Builder style(AppearanceStyle appearanceStyle)
@@ -153,7 +154,7 @@ class PlainTextFormatter
         appearanceStyle = builder.appearanceStyle;
         wrapLines = builder.wrapLines;
         width = builder.width;
-        composer = builder.composer;
+        contents = builder.contents;
         textContent = builder.textContent;
         textAlignment = builder.textAlignment;
         horizontalOffset = builder.horizontalOffset;
@@ -169,6 +170,8 @@ class PlainTextFormatter
     {
         if (textContent != null && !textContent.getParagraphs().isEmpty())
         {
+            contents.setFont(appearanceStyle.getFont(), appearanceStyle.getFontSize());
+            
             for (Paragraph paragraph : textContent.getParagraphs())
             {
                 if (wrapLines)
@@ -182,7 +185,7 @@ class PlainTextFormatter
                 }
                 else
                 {
-                    composer.showText(paragraph.getText(), appearanceStyle.getFont());
+                    contents.showText(paragraph.getText());
                 }
             }
         }
@@ -230,7 +233,7 @@ class PlainTextFormatter
             
             if (lines.indexOf(line) == 0)
             {
-                composer.newLineAtOffset(offset, verticalOffset);
+                contents.newLineAtOffset(offset, verticalOffset);
                 // reset the initial verticalOffset
                 verticalOffset = 0f;
                 horizontalOffset = 0f;
@@ -239,18 +242,19 @@ class PlainTextFormatter
             {
                 // keep the last position
                 verticalOffset = verticalOffset - appearanceStyle.getLeading();
-                composer.newLineAtOffset(offset, -appearanceStyle.getLeading());
+                contents.newLineAtOffset(offset, -appearanceStyle.getLeading());
             }
             lastPos = startOffset; 
 
             List<Word> words = line.getWords();
+            contents.setFont(appearanceStyle.getFont(), appearanceStyle.getFontSize());
             for (Word word : words)
             {
-                composer.showText(word.getText(), font);
+                contents.showText(word.getText());
                 wordWidth = (Float) word.getAttributes().getIterator().getAttribute(TextAttribute.WIDTH);
                 if (words.indexOf(word) != words.size() -1)
                 {
-                    composer.newLineAtOffset(wordWidth + interWordSpacing, 0f);
+                    contents.newLineAtOffset(wordWidth + interWordSpacing, 0f);
                     lastPos = lastPos + wordWidth + interWordSpacing;
                 }
             }