Author: tilman
Date: Sat Jun 28 10:53:41 2014
New Revision: 1606315

URL: http://svn.apache.org/r1606315
Log:
PDFBOX-1875: use BBox for clipping when rendering a form xobject

Modified:
    
pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java

Modified: 
pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java?rev=1606315&r1=1606314&r2=1606315&view=diff
==============================================================================
--- 
pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java
 (original)
+++ 
pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java
 Sat Jun 28 10:53:41 2014
@@ -17,6 +17,9 @@
 package org.apache.pdfbox.util.operator.pagedrawer;
 
 import java.awt.geom.AffineTransform;
+import java.awt.geom.Area;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Point2D;
 import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.util.List;
@@ -30,6 +33,7 @@ import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.pdfviewer.PageDrawer;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDResources;
+import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.graphics.PDGraphicsState;
 import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObject;
 import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm;
@@ -129,7 +133,35 @@ public class Invoke extends OperatorProc
                 Matrix xobjectCTM = matrix.multiply( 
context.getGraphicsState().getCurrentTransformationMatrix());
                 
context.getGraphicsState().setCurrentTransformationMatrix(xobjectCTM);
             }
-            getContext().processSubStream( page, pdResources, 
formContentstream );
+            if (form.getBBox() != null)
+            {
+                PDGraphicsState graphicsState = context.getGraphicsState();
+                PDRectangle bBox = form.getBBox();
+
+                float x1 = bBox.getLowerLeftX();
+                float y1 = bBox.getLowerLeftY();
+                float x2 = bBox.getUpperRightX();
+                float y2 = bBox.getUpperRightY();
+
+                Point2D p0 = drawer.transformedPoint(x1, y1);
+                Point2D p1 = drawer.transformedPoint(x2, y1);
+                Point2D p2 = drawer.transformedPoint(x2, y2);
+                Point2D p3 = drawer.transformedPoint(x1, y2);
+
+                GeneralPath bboxPath = new GeneralPath();
+                bboxPath.moveTo((float) p0.getX(), (float) p0.getY());
+                bboxPath.lineTo((float) p1.getX(), (float) p1.getY());
+                bboxPath.lineTo((float) p2.getX(), (float) p2.getY());
+                bboxPath.lineTo((float) p3.getX(), (float) p3.getY());
+                bboxPath.closePath();
+                
+                Area resultClippingArea = new 
Area(graphicsState.getCurrentClippingPath());
+                Area newArea = new Area(bboxPath);            
+                resultClippingArea.intersect(newArea);
+
+                graphicsState.setCurrentClippingPath(resultClippingArea);
+            }
+            getContext().processSubStream(page, pdResources, 
formContentstream);
             
             // restore the graphics state
             context.setGraphicsState( 
(PDGraphicsState)context.getGraphicsStack().pop() );


Reply via email to