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