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 );