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/28 08:00:53 UTC

svn commit: r1634799 - in /pdfbox/trunk/pdfbox/src: main/java/org/apache/pdfbox/contentstream/ main/java/org/apache/pdfbox/contentstream/operator/ main/java/org/apache/pdfbox/contentstream/operator/graphics/ main/java/org/apache/pdfbox/pdmodel/ main/ja...

Author: jahewson
Date: Tue Oct 28 07:00:53 2014
New Revision: 1634799

URL: http://svn.apache.org/r1634799
Log:
PDFBOX-2423: Refactor appearance streams to be treated as Form XObjects

Added:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceStream.java
Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDContentStream.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFTextStreamEngine.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/DrawObject.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/graphics/DrawObject.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/PDRectangle.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/fdf/FDFField.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3CharProc.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/form/PDFormXObject.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDTilingPattern.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceDictionary.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceEntry.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/visible/PDVisibleSigBuilder.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAppearanceString.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/Matrix.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/TestFDF.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDContentStream.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDContentStream.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDContentStream.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDContentStream.java Tue Oct 28 07:00:53 2014
@@ -20,6 +20,7 @@ package org.apache.pdfbox.contentstream;
 import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.pdmodel.PDResources;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
+import org.apache.pdfbox.util.Matrix;
 
 /**
  * A content stream.
@@ -39,9 +40,12 @@ public interface PDContentStream
     public PDResources getResources();
 
     /**
-     * Returns the bounding box of the contents, if any.
+     * Returns the bounding box of the contents.
      */
     public PDRectangle getBBox();
 
-    // todo: Matrix
+    /**
+     * Returns the matrix which transforms from the stream's space to user space.
+     */
+    public Matrix getMatrix();
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java Tue Oct 28 07:00:53 2014
@@ -43,11 +43,12 @@ import org.apache.pdfbox.pdmodel.PDResou
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.font.PDFont;
 import org.apache.pdfbox.pdmodel.font.PDFontFactory;
-import org.apache.pdfbox.pdmodel.font.PDType3CharProc;
 import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
 import org.apache.pdfbox.pdmodel.graphics.pattern.PDTilingPattern;
 import org.apache.pdfbox.pdmodel.graphics.state.PDGraphicsState;
 import org.apache.pdfbox.pdmodel.graphics.state.PDTextState;
+import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
+import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream;
 import org.apache.pdfbox.util.Matrix;
 import org.apache.pdfbox.util.Vector;
 import org.apache.pdfbox.contentstream.operator.Operator;
@@ -217,6 +218,33 @@ public class PDFStreamEngine
     }
 
     /**
+     * Shows the given annotation.
+     *
+     * @param annotation An annotation on the current page.
+     * @throws IOException If an error occurred reading the annotation
+     */
+    public void showAnnotation(PDAnnotation annotation) throws IOException
+    {
+        PDAppearanceStream appearanceStream = getAppearance(annotation);
+        if (appearanceStream != null)
+        {
+            processStream(appearanceStream, null);
+        }
+    }
+
+    /**
+     * Returns the appearance stream to process for the given annotation. May be used to render
+     * a specific appearance such as "hover".
+     *
+     * @param annotation The current annotation.
+     * @return The stream to process.
+     */
+    public PDAppearanceStream getAppearance(PDAnnotation annotation)
+    {
+        return annotation.getNormalAppearanceStream();
+    }
+
+    /**
      * Process a child stream of the given page. Cannot be used with #processPage(PDPage).
      *
      * @param contentStream the child content stream
@@ -266,18 +294,26 @@ public class PDFStreamEngine
             resources = currentPage.getResources();
         }
 
+        saveGraphicsState();
+
+        // transform the CTM using the stream's matrix
+        getGraphicsState().getCurrentTransformationMatrix().concatenate(contentStream.getMatrix());
+
         // bounding box (for clipping)
         PDRectangle bbox = contentStream.getBBox();
-        if (patternBBox  !=null)
+        if (patternBBox !=null)
         {
             bbox = patternBBox;
         }
-        if (contentStream != currentPage && bbox != null)
+        if (bbox != null)
         {
             Area clip = new Area(new GeneralPath(new Rectangle(bbox.createDimension())));
+
+            // content stream space to user space
+            clip.transform(contentStream.getMatrix().createAffineTransform());
+
+            // CTM transform (user space => device space)
             clip.transform(getGraphicsState().getCurrentTransformationMatrix().createAffineTransform());
-            saveGraphicsState();
-            getGraphicsState().intersectClippingPath(clip);
         }
 
         // fixme: stream matrix
@@ -312,10 +348,7 @@ public class PDFStreamEngine
             parser.close();
         }
 
-        if (contentStream != currentPage && bbox != null)
-        {
-            restoreGraphicsState();
-        }
+        restoreGraphicsState();
 
         // restore page resources
         resources = parentResources;

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFTextStreamEngine.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFTextStreamEngine.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFTextStreamEngine.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFTextStreamEngine.java Tue Oct 28 07:00:53 2014
@@ -138,7 +138,7 @@ public class PDFTextStreamEngine extends
         float glyphHeight = font.getBoundingBox().getHeight() / 2;
 
         // transformPoint from glyph space -> text space
-        float height = (float)font.getFontMatrix().transformPoint(0, glyphHeight).getY();
+        float height = font.getFontMatrix().transformPoint(0, glyphHeight).y;
 
         // (modified) combined displacement, this is calculated *without* taking the character
         // spacing and word spacing into account, due to legacy code in TextStripper

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/DrawObject.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/DrawObject.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/DrawObject.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/DrawObject.java Tue Oct 28 07:00:53 2014
@@ -20,7 +20,6 @@ import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.pdmodel.graphics.PDXObject;
 import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
-import org.apache.pdfbox.util.Matrix;
 import org.apache.pdfbox.util.PDFMarkedContentExtractor;
 
 import java.io.IOException;
@@ -47,15 +46,6 @@ public class DrawObject extends Operator
         if(xobject instanceof PDFormXObject)
         {
             PDFormXObject form = (PDFormXObject)xobject;
-
-            // if there is an optional form matrix, we have to map the form space to the user space
-            Matrix matrix = form.getMatrix();
-            if (matrix != null) 
-            {
-                Matrix xobjectCTM = matrix.multiply(context.getGraphicsState().getCurrentTransformationMatrix());
-                context.getGraphicsState().setCurrentTransformationMatrix(xobjectCTM);
-            }
-
             context.showForm(form);
         }
     }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/graphics/DrawObject.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/graphics/DrawObject.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/graphics/DrawObject.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/graphics/DrawObject.java Tue Oct 28 07:00:53 2014
@@ -16,7 +16,6 @@
  */
 package org.apache.pdfbox.contentstream.operator.graphics;
 
-import java.awt.geom.GeneralPath;
 import java.io.IOException;
 import java.util.List;
 
@@ -25,12 +24,9 @@ import org.apache.commons.logging.LogFac
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.filter.MissingImageReaderException;
-import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
 import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
 import org.apache.pdfbox.pdmodel.graphics.PDXObject;
-import org.apache.pdfbox.pdmodel.graphics.state.PDGraphicsState;
-import org.apache.pdfbox.util.Matrix;
 import org.apache.pdfbox.contentstream.operator.Operator;
 
 /**
@@ -79,30 +75,7 @@ public final class DrawObject extends Gr
             }
             else
             {
-                // save the graphics state
-                context.saveGraphicsState();
-
-                // if there is an optional form matrix, we have to map the form space to the user space
-                Matrix matrix = form.getMatrix();
-                if (matrix != null)
-                {
-                    Matrix xobjectCTM = matrix.multiply(
-                                    context.getGraphicsState().getCurrentTransformationMatrix());
-                    context.getGraphicsState().setCurrentTransformationMatrix(xobjectCTM);
-                }
-
-                // clip to the form's BBox
-                if (form.getBBox() != null)
-                {
-                    PDGraphicsState graphicsState = context.getGraphicsState();
-                    PDRectangle bBox = form.getBBox();
-                    GeneralPath bboxPath = context.transformedPDRectanglePath(bBox);
-                    graphicsState.intersectClippingPath(bboxPath);
-                }
                 getContext().showForm(form);
-
-                // restore the graphics state
-                context.restoreGraphicsState();
             }
         }
     }

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=1634799&r1=1634798&r2=1634799&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 Tue Oct 28 07:00:53 2014
@@ -273,9 +273,10 @@ public class PDDocument implements Close
             acroForm.setDefaultResources(null);
             // Set empty Appearance-Dictionary
             PDAppearanceDictionary ap = new PDAppearanceDictionary();
+
             COSStream apsStream = getDocument().createCOSStream();
             apsStream.createUnfilteredStream();
-            PDAppearanceStream aps = new PDAppearanceStream(apsStream);
+            PDAppearanceStream aps = new PDAppearanceStream(apsStream, null);
             COSDictionary cosObject = (COSDictionary) aps.getCOSObject();
             cosObject.setItem(COSName.SUBTYPE, COSName.FORM);
             cosObject.setItem(COSName.BBOX, new PDRectangle());
@@ -326,7 +327,7 @@ public class PDDocument implements Close
 
                         // Appearance Dictionary auslesen und setzen
                         PDAppearanceDictionary ap = new PDAppearanceDictionary(
-                                (COSDictionary) cosBaseDict.getItem(COSName.AP));
+                                (COSDictionary) cosBaseDict.getItem(COSName.AP), null);
                         ap.getCOSObject().setDirect(true);
                         signatureField.getWidget().setAppearance(ap);
 

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java Tue Oct 28 07:00:53 2014
@@ -36,6 +36,7 @@ import org.apache.pdfbox.pdmodel.common.
 import org.apache.pdfbox.pdmodel.interactive.action.PDPageAdditionalActions;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
 import org.apache.pdfbox.pdmodel.interactive.pagenavigation.PDThreadBead;
+import org.apache.pdfbox.util.Matrix;
 
 /**
  * A page in a PDF document.
@@ -171,6 +172,13 @@ public class PDPage implements COSObject
         return getCropBox();
     }
 
+    @Override
+    public Matrix getMatrix()
+    {
+        // todo: take into account user-space unit redefinition?
+        return new Matrix();
+    }
+
     /**
      * A rectangle, expressed in default user space units, defining the boundaries of the physical
      * medium on which the page is intended to be displayed or printed.

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/PDRectangle.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/PDRectangle.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/PDRectangle.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/PDRectangle.java Tue Oct 28 07:00:53 2014
@@ -16,6 +16,7 @@
  */
 package org.apache.pdfbox.pdmodel.common;
 
+import java.awt.geom.Point2D;
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSFloat;
@@ -24,6 +25,7 @@ import org.apache.pdfbox.cos.COSNumber;
 import org.apache.fontbox.util.BoundingBox;
 
 import java.awt.Dimension;
+import org.apache.pdfbox.util.Matrix;
 
 /**
  * A rectangle in a PDF document.
@@ -301,6 +303,20 @@ public class PDRectangle implements COSO
         setLowerLeftY(getLowerLeftY() + verticalAmount);
     }
 
+    // todo: new
+    public PDRectangle transform(Matrix matrix)
+    {
+        Point2D.Float lowerLeft = matrix.transformPoint(getLowerLeftX(), getLowerLeftY());
+        Point2D.Float upperRight = matrix.transformPoint(getUpperRightX(), getUpperRightY());
+
+        PDRectangle rect = new PDRectangle();
+        rect.setLowerLeftX(lowerLeft.x);
+        rect.setLowerLeftY(lowerLeft.y);
+        rect.setUpperRightX(upperRight.x);
+        rect.setUpperRightY(upperRight.y);
+        return rect;
+    }
+
     /**
      * Convert this standard java object to a COS object.
      *

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/fdf/FDFField.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/fdf/FDFField.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/fdf/FDFField.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/fdf/FDFField.java Tue Oct 28 07:00:53 2014
@@ -566,7 +566,7 @@ public class FDFField implements COSObje
         COSDictionary dict = (COSDictionary)field.getDictionaryObject( COSName.AP );
         if( dict != null )
         {
-            retval = new PDAppearanceDictionary( dict );
+            retval = new PDAppearanceDictionary( dict, null );
         }
         return retval;
     }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3CharProc.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3CharProc.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3CharProc.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3CharProc.java Tue Oct 28 07:00:53 2014
@@ -22,6 +22,7 @@ import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.pdmodel.PDResources;
 import org.apache.pdfbox.pdmodel.common.COSObjectable;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
+import org.apache.pdfbox.util.Matrix;
 
 /**
  * A Type 3 character procedure. This is a standalone PDF content stream.
@@ -68,5 +69,11 @@ public final class PDType3CharProc imple
         return font.getFontBBox();
     }
 
+    @Override
+    public Matrix getMatrix()
+    {
+        return font.getFontMatrix();
+    }
+
     // todo: add methods for getting the character's width from the stream
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/form/PDFormXObject.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/form/PDFormXObject.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/form/PDFormXObject.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/form/PDFormXObject.java Tue Oct 28 07:00:53 2014
@@ -51,7 +51,7 @@ final and all fields private.
  * 
  * @author Ben Litchfield
  */
-public final class PDFormXObject extends PDXObject implements PDContentStream
+public class PDFormXObject extends PDXObject implements PDContentStream
 {
     // name of XObject in resources, to prevent recursion
     private String name;
@@ -190,9 +190,10 @@ public final class PDFormXObject extends
     }
 
     /**
-     * This will get the optional Matrix of an XObjectForm. It maps the form space into the user space
+     * This will get the optional Matrix of an XObjectForm. It maps the form space to user space.
      * @return the form matrix
      */
+    @Override
     public Matrix getMatrix()
     {
         Matrix retval = null;
@@ -207,6 +208,11 @@ public final class PDFormXObject extends
             retval.setValue(2, 0, ((COSNumber) array.get(4)).floatValue());
             retval.setValue(2, 1, ((COSNumber) array.get(5)).floatValue());
         }
+        else
+        {
+            // default value is the identity matrix
+            retval = new Matrix();
+        }
         return retval;
     }
 

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDTilingPattern.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDTilingPattern.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDTilingPattern.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDTilingPattern.java Tue Oct 28 07:00:53 2014
@@ -242,10 +242,10 @@ public class PDTilingPattern extends PDA
     }
 
     /**
-     * This will get the optional Matrix of a Pattern.
-     * It maps the form space into the user space.
+     * This will get the optional Matrix of a Pattern. It maps the form space to user space.
      * @return the form matrix
      */
+    @Override
     public Matrix getMatrix()
     {
         Matrix matrix = null;
@@ -260,6 +260,11 @@ public class PDTilingPattern extends PDA
             matrix.setValue(2, 0, ((COSNumber) array.get(4)).floatValue());
             matrix.setValue(2, 1, ((COSNumber) array.get(5)).floatValue());
         }
+        else
+        {
+            // default value is the identity matrix
+            matrix = new Matrix();
+        }
         return matrix;
     }
 

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java Tue Oct 28 07:00:53 2014
@@ -305,7 +305,7 @@ public abstract class PDAnnotation imple
         COSDictionary apDic = (COSDictionary) dictionary.getDictionaryObject(COSName.AP);
         if (apDic != null)
         {
-            ap = new PDAppearanceDictionary(apDic);
+            ap = new PDAppearanceDictionary(apDic, this);
         }
         return ap;
     }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceDictionary.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceDictionary.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceDictionary.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceDictionary.java Tue Oct 28 07:00:53 2014
@@ -30,6 +30,7 @@ import org.apache.pdfbox.pdmodel.common.
 public class PDAppearanceDictionary implements COSObjectable
 {
     private final COSDictionary dictionary;
+    private PDAnnotation parent;
 
     /**
      * Constructor for embedding.
@@ -44,11 +45,12 @@ public class PDAppearanceDictionary impl
     /**
      * Constructor for reading.
      *
-     * @param dict The annotations dictionary.
+     * @param dictionary The annotations dictionary.
      */
-    public PDAppearanceDictionary( COSDictionary dict )
+    public PDAppearanceDictionary( COSDictionary dictionary, PDAnnotation parent )
     {
-        dictionary = dict;
+        this.dictionary = dictionary;
+        this.parent = parent;
     }
 
     @Override
@@ -73,7 +75,7 @@ public class PDAppearanceDictionary impl
         }
         else
         {
-            return new PDAppearanceEntry(entry);
+            return new PDAppearanceEntry(entry, parent);
         }
     }
 
@@ -97,7 +99,7 @@ public class PDAppearanceDictionary impl
      */
     public void setNormalAppearance( PDAppearanceStream ap )
     {
-        dictionary.setItem( COSName.N, ap.getStream() );
+        dictionary.setItem( COSName.N, ap );
     }
 
     /**
@@ -117,7 +119,7 @@ public class PDAppearanceDictionary impl
         }
         else
         {
-            return new PDAppearanceEntry(entry);
+            return new PDAppearanceEntry(entry, parent);
         }
     }
 
@@ -141,7 +143,7 @@ public class PDAppearanceDictionary impl
      */
     public void setRolloverAppearance( PDAppearanceStream ap )
     {
-        dictionary.setItem( COSName.R, ap.getStream() );
+        dictionary.setItem( COSName.R, ap );
     }
 
     /**
@@ -161,7 +163,7 @@ public class PDAppearanceDictionary impl
         }
         else
         {
-            return new PDAppearanceEntry(entry);
+            return new PDAppearanceEntry(entry, parent);
         }
     }
 
@@ -185,6 +187,6 @@ public class PDAppearanceDictionary impl
      */
     public void setDownAppearance( PDAppearanceStream ap )
     {
-        dictionary.setItem( COSName.D, ap.getStream() );
+        dictionary.setItem( COSName.D, ap );
     }
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceEntry.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceEntry.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceEntry.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceEntry.java Tue Oct 28 07:00:53 2014
@@ -35,6 +35,7 @@ import org.apache.pdfbox.pdmodel.common.
 public class PDAppearanceEntry implements COSObjectable
 {
     private COSBase entry;
+    private PDAnnotation parent;
 
     private PDAppearanceEntry()
     {
@@ -43,10 +44,12 @@ public class PDAppearanceEntry implement
     /**
      * Constructor for reading.
      * @param entry
+     * @param parent
      */
-    public PDAppearanceEntry(COSBase entry)
+    public PDAppearanceEntry(COSBase entry, PDAnnotation parent)
     {
         this.entry = entry;
+        this.parent = parent;
     }
 
     @Override
@@ -82,7 +85,7 @@ public class PDAppearanceEntry implement
         {
             throw new IllegalStateException();
         }
-        return new PDAppearanceStream((COSStream)entry);
+        return new PDAppearanceStream((COSStream)entry, parent);
     }
 
     /**
@@ -107,7 +110,7 @@ public class PDAppearanceEntry implement
             // the file from PDFBOX-1599 contains /null as its entry, so we skip non-stream entries
             if(value instanceof COSStream)
             {
-                map.put(name, new PDAppearanceStream((COSStream)value));
+                map.put(name, new PDAppearanceStream((COSStream)value, parent));
             }
         }
 

Added: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceStream.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceStream.java?rev=1634799&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceStream.java (added)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceStream.java Tue Oct 28 07:00:53 2014
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.interactive.annotation;
+
+import org.apache.pdfbox.cos.COSArray;
+import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.cos.COSNumber;
+import org.apache.pdfbox.cos.COSStream;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.common.PDRectangle;
+import org.apache.pdfbox.pdmodel.common.PDStream;
+import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
+import org.apache.pdfbox.util.Matrix;
+
+/**
+ * An appearance stream is a form XObject, a self-contained content stream that shall be rendered
+ * inside the annotation rectangle.
+ *
+ * @author Ben Litchfield
+ * @author John Hewson
+ */
+public class PDAppearanceStream extends PDFormXObject
+{
+    private final PDAnnotation parent;
+
+    /**
+     * Creates a Form XObject for reading.
+     * @param stream The XObject stream
+     */
+    public PDAppearanceStream(COSStream stream, PDAnnotation parent)
+    {
+        super(new PDStream(stream));
+        this.parent = parent;
+    }
+
+    /**
+     * Creates a Form Image XObject for writing, in the given document.
+     * @param document The current document
+     */
+    public PDAppearanceStream(PDDocument document, PDAnnotation parent)
+    {
+        super(document);
+        this.parent = parent;
+    }
+
+    /**
+     * Returns the matrix "A", which transforms the appearance box to align with the edges of the
+     * annotation?s rectangle.
+     */
+    @Override
+    public Matrix getMatrix()
+    {
+        PDRectangle bbox = getBBox();
+        PDRectangle rect = parent.getRectangle();
+        Matrix matrix = getActualMatrix();
+
+        // transformed appearance box
+        PDRectangle transformedBox = bbox.transform(matrix);
+
+        // compute a matrix which scales and translates the transformed appearance box to align
+        // with the edges of the annotation's rectangle
+        Matrix a = Matrix.getTranslatingInstance(rect.getLowerLeftX(), rect.getLowerLeftY());
+        a.concatenate(Matrix.getScaleInstance(rect.getWidth() / transformedBox.getWidth(),
+                                              rect.getHeight() / transformedBox.getHeight()));
+        a.concatenate(Matrix.getTranslatingInstance(-transformedBox.getLowerLeftX(),
+                                                    -transformedBox.getLowerLeftY()));
+        return a;
+    }
+
+    /**
+     * Returns the actual /Matrix entry, unlike other forms this needs to be transformed using
+     * the parent annotation's /Rect before it can be used to render the content stream.
+     */
+    private Matrix getActualMatrix()
+    {
+        COSArray array = (COSArray)getContentStream().getDictionaryObject(COSName.MATRIX);
+        if( array != null )
+        {
+            Matrix matrix = new Matrix();
+            matrix.setValue(0, 0, ((COSNumber) array.get(0)).floatValue());
+            matrix.setValue(0, 1, ((COSNumber) array.get(1)).floatValue());
+            matrix.setValue(1, 0, ((COSNumber) array.get(2)).floatValue());
+            matrix.setValue(1, 1, ((COSNumber) array.get(3)).floatValue());
+            matrix.setValue(2, 0, ((COSNumber) array.get(4)).floatValue());
+            matrix.setValue(2, 1, ((COSNumber) array.get(5)).floatValue());
+            return matrix;
+        }
+        else
+        {
+            // the default value is the identity matrix
+            return new Matrix();
+        }
+    }
+}

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/visible/PDVisibleSigBuilder.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/visible/PDVisibleSigBuilder.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/visible/PDVisibleSigBuilder.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/visible/PDVisibleSigBuilder.java Tue Oct 28 07:00:53 2014
@@ -225,7 +225,7 @@ public class PDVisibleSigBuilder impleme
         PDAppearanceDictionary appearance = new PDAppearanceDictionary();
         appearance.getCOSObject().setDirect(true);
 
-        PDAppearanceStream appearanceStream = new PDAppearanceStream(holderForml.getCOSStream());
+        PDAppearanceStream appearanceStream = new PDAppearanceStream(holderForml.getCOSStream(), null);
 
         appearance.setNormalAppearance(appearanceStream);
         signatureField.getWidget().setAppearance(appearance);

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAppearanceString.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAppearanceString.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAppearanceString.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDAppearanceString.java Tue Oct 28 07:00:53 2014
@@ -49,9 +49,9 @@ import org.apache.pdfbox.pdmodel.interac
 import org.apache.pdfbox.contentstream.operator.Operator;
 
 /**
- * A default appearance string contains any graphics state or text state operators needed to establish the graphics
- * state parameters, such as text size and colour, for displaying the field's variable text. Only operators that are
- * allowed within text objects shall occur in this string.
+ * A default appearance string contains any graphics state or text state operators needed to
+ * establish the graphics state parameters, such as text size and colour, for displaying the field's
+ * variable text. Only operators that are allowed within text objects shall occur in this string.
  *
  * @author Stephan Gerhard
  * @author Ben Litchfield
@@ -144,7 +144,7 @@ public final class PDAppearanceString
         List<Object> tokens = new ArrayList<Object>();
         if (appearanceStream != null)
         {
-            tokens = getStreamTokens(appearanceStream.getStream());
+            tokens = getStreamTokens(appearanceStream);
         }
         return tokens;
     }
@@ -240,7 +240,7 @@ public final class PDAppearanceString
                 if (appearanceStream == null)
                 {
                     COSStream cosStream = acroForm.getDocument().getDocument().createCOSStream();
-                    appearanceStream = new PDAppearanceStream(cosStream);
+                    appearanceStream = new PDAppearanceStream(cosStream, widget);
                     appearanceStream.setBBox(widget.getRectangle()
                             .createRetranslatedRectangle());
                     appearance.setNormalAppearance(appearanceStream);
@@ -415,7 +415,8 @@ public final class PDAppearanceString
         printWriter.println(leftOffset + " " + verticalOffset + " Td");
 
         // add the value as hex string to deal with non ISO-8859-1 data values
-        if (!isMultiLineValue(value) || stringWidth > borderEdge.getWidth() - paddingLeft - paddingRight)
+        if (!isMultiLineValue(value) || stringWidth > borderEdge.getWidth() - paddingLeft -
+                paddingRight)
         {
             printWriter.println("<" + new COSString(value).getHexString() + "> Tj");
         }
@@ -481,7 +482,7 @@ public final class PDAppearanceString
      */
     private void writeToStream(byte[] data, PDAppearanceStream appearanceStream) throws IOException
     {
-        OutputStream out = appearanceStream.getStream().createUnfilteredStream();
+        OutputStream out = appearanceStream.getCOSStream().createUnfilteredStream();
         out.write(data);
         out.flush();
     }
@@ -538,7 +539,8 @@ public final class PDAppearanceString
     }
 
     /**
-     * My "not so great" method for calculating the fontsize. It does not work superb, but it handles ok.
+     * My "not so great" method for calculating the fontsize. It does not work superb, but it
+     * handles ok.
      * 
      * @return the calculated font-size
      *
@@ -590,8 +592,8 @@ public final class PDAppearanceString
     }
 
     /**
-     * Calculates where to start putting the text in the box. The positioning is not quite as accurate as when Acrobat
-     * places the elements, but it works though.
+     * Calculates where to start putting the text in the box. The positioning is not quite as
+     * accurate as when Acrobat places the elements, but it works though.
      *
      * @return the sting for representing the start position of the text
      *
@@ -626,7 +628,8 @@ public final class PDAppearanceString
             }
             else
             {
-                LOG.debug("Unable to calculate the vertical offset for non-simple fonts - using 0 instead");
+                LOG.debug("Unable to calculate the vertical offset for non-simple fonts - " +
+                          "using 0 instead");
             }
         }
         return verticalOffset;

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java Tue Oct 28 07:00:53 2014
@@ -45,7 +45,6 @@ import org.apache.pdfbox.pdmodel.font.PD
 import org.apache.pdfbox.pdmodel.font.PDType3CharProc;
 import org.apache.pdfbox.pdmodel.graphics.image.PDImage;
 import org.apache.pdfbox.pdmodel.graphics.state.RenderingMode;
-import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceEntry;
 import org.apache.pdfbox.rendering.font.CIDType0Glyph2D;
 import org.apache.pdfbox.rendering.font.Glyph2D;
 import org.apache.pdfbox.rendering.font.TTFGlyph2D;
@@ -69,7 +68,6 @@ import org.apache.pdfbox.pdmodel.graphic
 import org.apache.pdfbox.pdmodel.graphics.shading.PDShading;
 import org.apache.pdfbox.pdmodel.graphics.state.PDGraphicsState;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
-import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceDictionary;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream;
 import org.apache.pdfbox.util.Matrix;
 import org.apache.pdfbox.contentstream.PDFGraphicsStreamEngine;
@@ -157,94 +155,13 @@ public class PageDrawer extends PDFGraph
         graphics.setStroke(new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER));
 
         processPage(getPage());
-        showAnnotations();
 
-        graphics = null;
-    }
-
-    private void showAnnotations() throws IOException
-    {
         for (PDAnnotation annotation : getPage().getAnnotations())
         {
-            PDAppearanceStream appearanceStream = annotation.getNormalAppearanceStream();
-            if (appearanceStream != null)
-            {
-                saveGraphicsState();
-
-                PDRectangle rect = annotation.getRectangle();
-                Rectangle2D rect2D = new Rectangle2D.Float(
-                        rect.getLowerLeftX(),
-                        rect.getLowerLeftY(),
-                        rect.getWidth(),
-                        rect.getHeight());
-
-                Matrix matrix = appearanceStream.getMatrix();
-                if (matrix == null)
-                {
-                    matrix = new Matrix();
-                }
-
-                // PDF Spec 12.5.5:
-                // a) The appearance's bounding box (specified by its BBox entry)
-                // shall be transformed, using Matrix, to produce a quadrilateral
-                // with arbitrary orientation.
-                PDRectangle bBox = appearanceStream.getBBox();
-                Point2D p1 = new Point2D.Float(bBox.getLowerLeftX(), bBox.getLowerLeftY());
-                Point2D p2 = new Point2D.Float(bBox.getUpperRightX(), bBox.getUpperRightY());
-                matrix.createAffineTransform().transform(p1, p1);
-                matrix.createAffineTransform().transform(p2, p2);
-                Rectangle2D transformedBBox = new Rectangle2D.Float(
-                        (float) Math.min(p1.getX(), p2.getX()),
-                        (float) Math.min(p1.getY(), p2.getY()),
-                        (float) Math.abs(p2.getX() - p1.getX()),
-                        (float) Math.abs(p2.getY() - p1.getY()));
-
-                // PDF Spec 12.5.5:
-                // b) A matrix A shall be computed that scales and translates
-                // the transformed appearance box to align with the edges
-                // of the annotation's rectangle
-                //
-                // code inspired from
-                // http://stackoverflow.com/a/14015713/535646
-                AffineTransform at = new AffineTransform();
-                at.translate(rect2D.getMinX(), rect2D.getMinY());
-                at.scale(rect2D.getWidth() / transformedBBox.getWidth(),
-                         rect2D.getHeight() / transformedBBox.getHeight());
-                at.translate(-transformedBBox.getMinX(), -transformedBBox.getMinY());
-                Matrix matrixA = new Matrix();
-                matrixA.setFromAffineTransform(at);
-
-                // PDF Spec 12.5.5:
-                // c) Matrix shall be concatenated with A to form a matrix AA
-                // that maps from the appearance's coordinate system to
-                // the annotation's rectangle in default user space
-                Matrix matrixAA = matrix.multiply(matrixA);
-
-                Point2D point = new Point2D.Float(matrixAA.getXPosition(), matrixAA.getYPosition());
-                matrixAA.setValue(2, 0, 0);
-                matrixAA.setValue(2, 1, 0);
-
-                getGraphicsState().setCurrentTransformationMatrix(matrixAA);
-
-                // Calculate clipping
-                // PDF Spec 12.5.5:
-                // a self-contained content stream that shall be rendered
-                // inside the annotation rectangle
-                Rectangle2D clipRect2D = new Rectangle2D.Float(
-                        (float) (rect2D.getMinX()-point.getX()),
-                        (float) (rect2D.getMinY()-point.getY()),
-                        (float) rect2D.getWidth(),
-                        (float) rect2D.getHeight());
-                getGraphicsState().intersectClippingPath(new Area(clipRect2D));
-
-                graphics.translate((int) point.getX(), (int) point.getY());
-                lastClip = null;
-                processChildStream(appearanceStream);
-                graphics.translate(-(int) point.getX(), -(int) point.getY());
-
-                restoreGraphicsState();
-            }
+            showAnnotation(annotation);
         }
+
+        graphics = null;
     }
 
     /**
@@ -564,7 +481,7 @@ public class PageDrawer extends PDFGraph
     {
         return getGraphicsState().getNonStrokingColorSpace()
                 .toPaint(renderer, getPage(), getGraphicsState().getNonStrokingColor(),
-                         getSubStreamMatrix(), xform);
+                        getSubStreamMatrix(), xform);
     }
 
     // create a new stroke based on the current CTM and the current stroke

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/Matrix.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/Matrix.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/Matrix.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/Matrix.java Tue Oct 28 07:00:53 2014
@@ -318,14 +318,14 @@ public class Matrix implements Cloneable
      * @param x x-coordinate
      * @param y y-coordinate
      */
-    public Point2D transformPoint(double x, double y) {
+    public Point2D.Float transformPoint(float x, float y) {
         float a = single[0];
         float b = single[1];
         float c = single[3];
         float d = single[4];
         float e = single[6];
         float f = single[7];
-        return new Point2D.Double(x * a + y * c + e, x * b + y * d + f);
+        return new Point2D.Float(x * a + y * c + e, x * b + y * d + f);
     }
 
     /**

Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/TestFDF.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/TestFDF.java?rev=1634799&r1=1634798&r2=1634799&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/TestFDF.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/TestFDF.java Tue Oct 28 07:00:53 2014
@@ -246,7 +246,7 @@ public class TestFDF extends TestCase
         PDAnnotationWidget widget = field.getWidget();
         PDAppearanceEntry normalAppearance = widget.getAppearance().getNormalAppearance();
         PDAppearanceStream appearanceStream = normalAppearance.getAppearanceStream();
-        COSStream actual = appearanceStream.getStream();
+        COSStream actual = appearanceStream.getCOSStream();
 
         List<Object> actualTokens = getStreamTokens( doc, actual );
         assertTrue( actualTokens.contains( new COSString( expected ) ) );
@@ -257,7 +257,7 @@ public class TestFDF extends TestCase
         PDAnnotationWidget widget = field.getWidget();
         PDAppearanceEntry normalAppearance = widget.getAppearance().getNormalAppearance();
         PDAppearanceStream appearanceStream = normalAppearance.getAppearanceStream();
-        COSStream actual = appearanceStream.getStream();
+        COSStream actual = appearanceStream.getCOSStream();
 
         List<Object> actualTokens = getStreamTokens( doc, actual );
         List<Object> expectedTokens = getStreamTokens( doc, expected );