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/29 01:59:05 UTC
svn commit: r1635020 - in /pdfbox/trunk:
examples/src/main/java/org/apache/pdfbox/examples/pdmodel/
pdfbox/src/main/java/org/apache/pdfbox/contentstream/
pdfbox/src/main/java/org/apache/pdfbox/pdmodel/
pdfbox/src/main/java/org/apache/pdfbox/pdmodel/fdf...
Author: jahewson
Date: Wed Oct 29 00:59:04 2014
New Revision: 1635020
URL: http://svn.apache.org/r1635020
Log:
PDFBOX-2423: Fix annotation rendering
Modified:
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/RubberStampWithImage.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/fdf/FDFField.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/annotation/PDAppearanceStream.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
Modified: pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/RubberStampWithImage.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/RubberStampWithImage.java?rev=1635020&r1=1635019&r2=1635020&view=diff
==============================================================================
--- pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/RubberStampWithImage.java (original)
+++ pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/RubberStampWithImage.java Wed Oct 29 00:59:04 2014
@@ -137,8 +137,8 @@ public class RubberStampWithImage
drawXObject(ximage, form.getResources(), os, lowerLeftX, lowerLeftY, imgWidth, imgHeight);
os.close();
- PDAppearanceStream myDic = new PDAppearanceStream(form.getCOSStream(), rubberStamp);
- PDAppearanceDictionary appearance = new PDAppearanceDictionary(new COSDictionary(), rubberStamp);
+ PDAppearanceStream myDic = new PDAppearanceStream(form.getCOSStream());
+ PDAppearanceDictionary appearance = new PDAppearanceDictionary(new COSDictionary());
appearance.setNormalAppearance(myDic);
rubberStamp.setAppearance(appearance);
rubberStamp.setRectangle(rect);
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=1635020&r1=1635019&r2=1635020&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 Wed Oct 29 00:59:04 2014
@@ -270,6 +270,49 @@ public class PDFStreamEngine
popResources(parent);
}
+ /**
+ * Process the given annotation with the specified appearance stream.
+ *
+ * @param annotation The annotation containing the appearance stream to process.
+ * @param appearance The appearance stream to process.
+ */
+ protected void processAnnotation(PDAnnotation annotation, PDAppearanceStream appearance)
+ throws IOException
+ {
+ PDResources parent = pushResources(appearance);
+ saveGraphicsState();
+
+ PDRectangle bbox = appearance.getBBox();
+ PDRectangle rect = annotation.getRectangle();
+ Matrix matrix = appearance.getMatrix();
+
+ // 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()));
+
+ // 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 aa = Matrix.concatenate(matrix, a);
+
+ // make matrix AA the CTM
+ getGraphicsState().setCurrentTransformationMatrix(aa);
+
+ // clip to bounding box
+ clipToRect(bbox);
+
+ processStreamOperators(appearance);
+
+ restoreGraphicsState();
+ popResources(parent);
+ }
+
// todo: a temporary workaround for tiling patterns (overrides matrix and bbox)
public final void processChildStreamWithMatrix(PDTilingPattern contentStream, PDPage page,
Matrix matrix, PDRectangle bbox) throws IOException
@@ -295,7 +338,7 @@ public class PDFStreamEngine
PDAppearanceStream appearanceStream = getAppearance(annotation);
if (appearanceStream != null)
{
- processStream(appearanceStream, null);
+ processAnnotation(annotation, appearanceStream);
}
}
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=1635020&r1=1635019&r2=1635020&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 Wed Oct 29 00:59:04 2014
@@ -279,7 +279,7 @@ public class PDDocument implements Close
COSStream apsStream = getDocument().createCOSStream();
apsStream.createUnfilteredStream();
- PDAppearanceStream aps = new PDAppearanceStream(apsStream, null);
+ PDAppearanceStream aps = new PDAppearanceStream(apsStream);
COSDictionary cosObject = (COSDictionary) aps.getCOSObject();
cosObject.setItem(COSName.SUBTYPE, COSName.FORM);
cosObject.setItem(COSName.BBOX, new PDRectangle());
@@ -330,7 +330,7 @@ public class PDDocument implements Close
// Appearance Dictionary auslesen und setzen
PDAppearanceDictionary ap = new PDAppearanceDictionary(
- (COSDictionary) cosBaseDict.getItem(COSName.AP), null);
+ (COSDictionary) cosBaseDict.getItem(COSName.AP));
ap.getCOSObject().setDirect(true);
signatureField.getWidget().setAppearance(ap);
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=1635020&r1=1635019&r2=1635020&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 Wed Oct 29 00:59:04 2014
@@ -566,7 +566,7 @@ public class FDFField implements COSObje
COSDictionary dict = (COSDictionary)field.getDictionaryObject( COSName.AP );
if( dict != null )
{
- retval = new PDAppearanceDictionary( dict, null );
+ retval = new PDAppearanceDictionary( dict );
}
return retval;
}
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=1635020&r1=1635019&r2=1635020&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 Wed Oct 29 00:59:04 2014
@@ -305,7 +305,7 @@ public abstract class PDAnnotation imple
COSDictionary apDic = (COSDictionary) dictionary.getDictionaryObject(COSName.AP);
if (apDic != null)
{
- ap = new PDAppearanceDictionary(apDic, this);
+ ap = new PDAppearanceDictionary(apDic);
}
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=1635020&r1=1635019&r2=1635020&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 Wed Oct 29 00:59:04 2014
@@ -30,7 +30,6 @@ import org.apache.pdfbox.pdmodel.common.
public class PDAppearanceDictionary implements COSObjectable
{
private final COSDictionary dictionary;
- private PDAnnotation parent;
/**
* Constructor for embedding.
@@ -47,10 +46,9 @@ public class PDAppearanceDictionary impl
*
* @param dictionary The annotations dictionary.
*/
- public PDAppearanceDictionary( COSDictionary dictionary, PDAnnotation parent )
+ public PDAppearanceDictionary( COSDictionary dictionary )
{
this.dictionary = dictionary;
- this.parent = parent;
}
@Override
@@ -75,7 +73,7 @@ public class PDAppearanceDictionary impl
}
else
{
- return new PDAppearanceEntry(entry, parent);
+ return new PDAppearanceEntry(entry);
}
}
@@ -119,7 +117,7 @@ public class PDAppearanceDictionary impl
}
else
{
- return new PDAppearanceEntry(entry, parent);
+ return new PDAppearanceEntry(entry);
}
}
@@ -163,7 +161,7 @@ public class PDAppearanceDictionary impl
}
else
{
- return new PDAppearanceEntry(entry, parent);
+ return new PDAppearanceEntry(entry);
}
}
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=1635020&r1=1635019&r2=1635020&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 Wed Oct 29 00:59:04 2014
@@ -35,7 +35,6 @@ import org.apache.pdfbox.pdmodel.common.
public class PDAppearanceEntry implements COSObjectable
{
private COSBase entry;
- private PDAnnotation parent;
private PDAppearanceEntry()
{
@@ -46,10 +45,9 @@ public class PDAppearanceEntry implement
* @param entry
* @param parent
*/
- public PDAppearanceEntry(COSBase entry, PDAnnotation parent)
+ public PDAppearanceEntry(COSBase entry)
{
this.entry = entry;
- this.parent = parent;
}
@Override
@@ -85,7 +83,7 @@ public class PDAppearanceEntry implement
{
throw new IllegalStateException();
}
- return new PDAppearanceStream((COSStream)entry, parent);
+ return new PDAppearanceStream((COSStream)entry);
}
/**
@@ -110,7 +108,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, parent));
+ map.put(name, new PDAppearanceStream((COSStream)value));
}
}
Modified: 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=1635020&r1=1635019&r2=1635020&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceStream.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceStream.java Wed Oct 29 00:59:04 2014
@@ -17,15 +17,10 @@
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
@@ -36,74 +31,21 @@ import org.apache.pdfbox.util.Matrix;
*/
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)
+ public PDAppearanceStream(COSStream stream)
{
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)
+ public PDAppearanceStream(PDDocument document)
{
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=1635020&r1=1635019&r2=1635020&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 Wed Oct 29 00:59:04 2014
@@ -225,7 +225,7 @@ public class PDVisibleSigBuilder impleme
PDAppearanceDictionary appearance = new PDAppearanceDictionary();
appearance.getCOSObject().setDirect(true);
- PDAppearanceStream appearanceStream = new PDAppearanceStream(holderForml.getCOSStream(), null);
+ PDAppearanceStream appearanceStream = new PDAppearanceStream(holderForml.getCOSStream());
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=1635020&r1=1635019&r2=1635020&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 Wed Oct 29 00:59:04 2014
@@ -240,7 +240,7 @@ public final class PDAppearanceString
if (appearanceStream == null)
{
COSStream cosStream = acroForm.getDocument().getDocument().createCOSStream();
- appearanceStream = new PDAppearanceStream(cosStream, widget);
+ appearanceStream = new PDAppearanceStream(cosStream);
appearanceStream.setBBox(widget.getRectangle()
.createRetranslatedRectangle());
appearance.setNormalAppearance(appearanceStream);