You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2013/03/24 14:40:25 UTC

svn commit: r1460370 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: pdfviewer/PageDrawer.java pdmodel/interactive/annotation/PDAppearanceStream.java

Author: lehmi
Date: Sun Mar 24 13:40:25 2013
New Revision: 1460370

URL: http://svn.apache.org/r1460370
Log:
PDFBOX-1538 use a given transformation matrix when rendering an annotation

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceStream.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java?rev=1460370&r1=1460369&r2=1460370&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java Sun Mar 24 13:40:25 2013
@@ -124,7 +124,7 @@ public class PageDrawer extends PDFStrea
             PDResources resources = page.findResources();
             processStream( page, resources, page.getContents().getStream() );
         }
-        List annotations = page.getAnnotations();
+        List<PDAnnotation> annotations = page.getAnnotations();
         for( int i=0; i<annotations.size(); i++ )
         {
             PDAnnotation annot = (PDAnnotation)annotations.get( i );
@@ -137,16 +137,24 @@ public class PageDrawer extends PDFStrea
                 {
                     appearanceName = "default";
                 }
-                Map appearanceMap = appearDictionary.getNormalAppearance();
+                Map<String, PDAppearanceStream> appearanceMap = appearDictionary.getNormalAppearance();
                 if (appearanceMap != null) 
                 { 
                     PDAppearanceStream appearance = 
                         (PDAppearanceStream)appearanceMap.get( appearanceName ); 
                     if( appearance != null ) 
                     { 
-                        g.translate( (int)rect.getLowerLeftX(), (int)-rect.getLowerLeftY() ); 
+                        Point2D point = new Point2D.Float(rect.getLowerLeftX(), rect.getLowerLeftY());
+                        Matrix matrix = appearance.getMatrix();
+                        if (matrix != null) 
+                        {
+                            // transform the rectangle using the given matrix 
+                            AffineTransform at = matrix.createAffineTransform();
+                            at.transform(point, point);
+                        }
+                        g.translate( (int)point.getX(), -(int)point.getY() );
                         processSubStream( page, appearance.getResources(), appearance.getStream() ); 
-                        g.translate( (int)-rect.getLowerLeftX(), (int)+rect.getLowerLeftY() ); 
+                        g.translate( -(int)point.getX(), (int)point.getY() ); 
                     }
                 }
             }

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=1460370&r1=1460369&r2=1460370&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 Sun Mar 24 13:40:25 2013
@@ -16,16 +16,21 @@
  */
 package org.apache.pdfbox.pdmodel.interactive.annotation;
 
+import java.awt.geom.AffineTransform;
+
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSFloat;
 import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.cos.COSNumber;
 import org.apache.pdfbox.cos.COSStream;
 
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.common.COSObjectable;
 
 import org.apache.pdfbox.pdmodel.PDResources;
+import org.apache.pdfbox.util.Matrix;
 
 
 /**
@@ -76,7 +81,7 @@ public class PDAppearanceStream implemen
     public PDRectangle getBoundingBox()
     {
         PDRectangle box = null;
-        COSArray bbox = (COSArray)stream.getDictionaryObject( COSName.getPDFName( "BBox" ) );
+        COSArray bbox = (COSArray)stream.getDictionaryObject( COSName.BBOX );
         if( bbox != null )
         {
             box = new PDRectangle( bbox );
@@ -96,7 +101,7 @@ public class PDAppearanceStream implemen
         {
             array = rectangle.getCOSArray();
         }
-        stream.setItem( COSName.getPDFName( "BBox" ), array );
+        stream.setItem( COSName.BBOX, array );
     }
 
     /**
@@ -129,4 +134,50 @@ public class PDAppearanceStream implemen
         }
         stream.setItem( COSName.RESOURCES, dict );
     }
+
+    /**
+     * Gets the optional matrix for this appearance.  This may return null.
+     *
+     * @return The matrix of this appearance.
+     */
+    public Matrix getMatrix()
+    {
+        Matrix retval = null;
+        COSArray array = (COSArray)stream.getDictionaryObject( COSName.MATRIX );
+        if( array != null )
+        {
+            retval = new Matrix();
+            retval.setValue(0, 0, ((COSNumber) array.get(0)).floatValue());
+            retval.setValue(0, 1, ((COSNumber) array.get(1)).floatValue());
+            retval.setValue(1, 0, ((COSNumber) array.get(2)).floatValue());
+            retval.setValue(1, 1, ((COSNumber) array.get(3)).floatValue());
+            retval.setValue(2, 0, ((COSNumber) array.get(4)).floatValue());
+            retval.setValue(2, 1, ((COSNumber) array.get(5)).floatValue());
+        }
+        return retval;
+    }
+
+    /**
+     * Sets the optional Matrix entry for this appearance.
+     * @param transform the transformation matrix
+     */
+    public void setMatrix(AffineTransform transform)
+    {
+        if (transform != null)
+        {
+            COSArray matrix = new COSArray();
+            double[] values = new double[6];
+            transform.getMatrix(values);
+            for (double v : values)
+            {
+                matrix.add(new COSFloat((float)v));
+            }
+            stream.setItem(COSName.MATRIX, matrix);
+        }
+        else
+        {
+            stream.removeItem(COSName.MATRIX);
+        }
+    }
+
 }