Author: lehmi
Date: Tue Mar  2 18:56:25 2010
New Revision: 918150

URL: http://svn.apache.org/viewvc?rev=918150&view=rev
Log:
PDFBOX-646: use the optional form matrix to map form the form space to the user 
space

Modified:
    
pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDXObjectForm.java
    
pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java

Modified: 
pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDXObjectForm.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDXObjectForm.java?rev=918150&r1=918149&r2=918150&view=diff
==============================================================================
--- 
pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDXObjectForm.java
 (original)
+++ 
pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDXObjectForm.java
 Tue Mar  2 18:56:25 2010
@@ -19,11 +19,13 @@
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.cos.COSNumber;
 import org.apache.pdfbox.cos.COSStream;
 
 import org.apache.pdfbox.pdmodel.PDResources;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.common.PDStream;
+import org.apache.pdfbox.util.Matrix;
 
 /**
  * A form xobject.
@@ -111,7 +113,7 @@
     /**
      * An array of four numbers in the form coordinate system (see
      * below), giving the coordinates of the left, bottom, right, and top 
edges,
-     * respectively, of the form XObjectÂ’s bounding box. These boundaries are 
used
+     * respectively, of the form XObject's bounding box. These boundaries are 
used
      * to clip the form XObject and to determine its size for caching.
      *
      * @return The BBox of the form.
@@ -143,4 +145,27 @@
             getCOSStream().setItem( COSName.BBOX, bbox.getCOSArray() );
         }
     }
+    
+    /**
+     * This will get the optional Matrix of an XObjectForm.
+     * It maps the form space into the user space
+     * @return the form matrix
+     */
+    public Matrix getMatrix() 
+    {
+        Matrix retval = null;
+        COSArray array = (COSArray)getCOSStream().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;
+    }
+    
 }

Modified: 
pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java?rev=918150&r1=918149&r2=918150&view=diff
==============================================================================
--- 
pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java
 (original)
+++ 
pdfbox/trunk/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java
 Tue Mar  2 18:56:25 2010
@@ -138,7 +138,14 @@
             {
                 pdResources = page.findResources();
             }
-
+            // 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);
+            }
             getContext().processSubStream( page, pdResources, invoke );
         }
         else


Reply via email to