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