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/28 23:35:32 UTC

svn commit: r1634999 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: contentstream/PDFStreamEngine.java pdmodel/PDPage.java pdmodel/graphics/state/PDGraphicsState.java rendering/PDFRenderer.java rendering/PageDrawer.java

Author: jahewson
Date: Tue Oct 28 22:35:31 2014
New Revision: 1634999

URL: http://svn.apache.org/r1634999
Log:
PDFBOX-2423: Fix for transparency groups and pages with non-origin crop boxes

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDGraphicsState.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java

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=1634999&r1=1634998&r2=1634999&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 Tue Oct 28 22:35:31 2014
@@ -17,7 +17,6 @@
 package org.apache.pdfbox.contentstream;
 
 import java.awt.geom.Area;
-import java.awt.geom.GeneralPath;
 import java.awt.geom.Point2D;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -307,9 +306,8 @@ public class PDFStreamEngine
         }
         if (bbox != null)
         {
-            Area clip = new Area(new GeneralPath(bbox.toRectangle2D()));
-            clip.transform(getGraphicsState().getCurrentTransformationMatrix().createAffineTransform());
-            getGraphicsState().intersectClippingPath(clip);
+            PDRectangle clip = bbox.transform(getGraphicsState().getCurrentTransformationMatrix());
+            getGraphicsState().intersectClippingPath(new Area(clip.toRectangle2D()));
         }
 
         // fixme: stream matrix
@@ -700,31 +698,6 @@ public class PDFStreamEngine
                 .transform(position, 0, position, 0, 1);
         return new Point2D.Double(position[0], position[1]);
     }
-
-    /**
-     * use the current transformation matrix to transformPoint a PDRectangle.
-     * 
-     * @param rect the PDRectangle to transformPoint
-     * @return the transformed coordinates as a GeneralPath
-     */
-    public GeneralPath transformedPDRectanglePath(PDRectangle rect)
-    {
-        float x1 = rect.getLowerLeftX();
-        float y1 = rect.getLowerLeftY();
-        float x2 = rect.getUpperRightX();
-        float y2 = rect.getUpperRightY();
-        Point2D p0 = transformedPoint(x1, y1);
-        Point2D p1 = transformedPoint(x2, y1);
-        Point2D p2 = transformedPoint(x2, y2);
-        Point2D p3 = transformedPoint(x1, y2);
-        GeneralPath path = new GeneralPath();
-        path.moveTo((float) p0.getX(), (float) p0.getY());
-        path.lineTo((float) p1.getX(), (float) p1.getY());
-        path.lineTo((float) p2.getX(), (float) p2.getY());
-        path.lineTo((float) p3.getX(), (float) p3.getY());
-        path.closePath();
-        return path;
-    }
     
     // transforms a width using the CTM
     protected float transformWidth(float width)

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java?rev=1634999&r1=1634998&r2=1634999&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java Tue Oct 28 22:35:31 2014
@@ -175,7 +175,7 @@ public class PDPage implements COSObject
     @Override
     public Matrix getMatrix()
     {
-        // todo: take into account user-space unit redefinition?
+        // todo: take into account user-space unit redefinition as scale?
         return new Matrix();
     }
 

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDGraphicsState.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDGraphicsState.java?rev=1634999&r1=1634998&r2=1634999&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDGraphicsState.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDGraphicsState.java Tue Oct 28 22:35:31 2014
@@ -70,18 +70,12 @@ public class PDGraphicsState implements 
     private double smoothness = 0;
 
     /**
-     * Constructor with a given pagesize to initialize the clipping path.
+     * Constructor with a given page size to initialize the clipping path.
      * @param page the size of the page
      */
     public PDGraphicsState(PDRectangle page)
     {
         clippingPath = new Area(new GeneralPath(page.toRectangle2D()));
-        if (page.getLowerLeftX() != 0 || page.getLowerLeftY() != 0)
-        {
-            //Compensate for offset
-            this.currentTransformationMatrix = this.currentTransformationMatrix.multiply(
-                    Matrix.getTranslatingInstance(-page.getLowerLeftX(), -page.getLowerLeftY()));
-        }
     }
 
     /**

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java?rev=1634999&r1=1634998&r2=1634999&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java Tue Oct 28 22:35:31 2014
@@ -178,7 +178,6 @@ public class PDFRenderer
     }
 
     // renders a page to the given graphics
-    // TODO need to be able to override this
     private void renderPage(PDPage page, Graphics2D graphics, int width, int height, float scaleX,
                             float scaleY) throws IOException
     {
@@ -187,7 +186,7 @@ public class PDFRenderer
         graphics.scale(scaleX, scaleY);
         // TODO should we be passing the scale to PageDrawer rather than messing with Graphics?
 
-        PDRectangle adjustedCropBox = page.getCropBox();
+        PDRectangle cropBox = page.getCropBox();
         int rotationAngle = page.getRotation();
         if (rotationAngle != 0)
         {
@@ -196,22 +195,21 @@ public class PDFRenderer
             switch (rotationAngle)
             {
                 case 90:
-                    translateX = adjustedCropBox.getHeight();
+                    translateX = cropBox.getHeight();
                     break;
                 case 270:
-                    translateY = adjustedCropBox.getWidth();
+                    translateY = cropBox.getWidth();
                     break;
                 case 180:
-                    translateX = adjustedCropBox.getWidth();
-                    translateY = adjustedCropBox.getHeight();
+                    translateX = cropBox.getWidth();
+                    translateY = cropBox.getHeight();
                     break;
             }
             graphics.translate(translateX, translateY);
             graphics.rotate((float) Math.toRadians(rotationAngle));
         }
 
-        // TODO: need to make it easy to use a custom PageDrawer and TilingPatternDrawer
         PageDrawer drawer = new PageDrawer(this, page);
-        drawer.drawPage(graphics, adjustedCropBox);
+        drawer.drawPage(graphics, cropBox);
     }
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java?rev=1634999&r1=1634998&r2=1634999&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java Tue Oct 28 22:35:31 2014
@@ -153,6 +153,9 @@ public class PageDrawer extends PDFGraph
         // TODO use getStroke() to set the initial stroke
         graphics.setStroke(new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER));
 
+        // adjust for non-(0,0) crop box
+        graphics.translate(-pageSize.getLowerLeftX(), -pageSize.getLowerLeftY());
+
         processPage(getPage());
 
         for (PDAnnotation annotation : getPage().getAnnotations())
@@ -765,7 +768,7 @@ public class PageDrawer extends PDFGraph
         super.showAnnotation(annotation);
     }
 
-    @Override
+    //@Override
     public void showTransparencyGroup(PDFormXObject form) throws IOException
     {
         TransparencyGroup group = createTransparencyGroup(form);
@@ -774,25 +777,7 @@ public class PageDrawer extends PDFGraph
 
     private TransparencyGroup createTransparencyGroup(PDFormXObject form) throws IOException
     {
-        saveGraphicsState();
-        try
-        {
-            // 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 xCTM = matrix.multiply(getGraphicsState().getCurrentTransformationMatrix());
-                getGraphicsState().setCurrentTransformationMatrix(xCTM);
-            }
-
-            PDRectangle bBox = form.getBBox();
-            GeneralPath path = transformedPDRectanglePath(bBox);
-            return new TransparencyGroup(path, form);
-        }
-        finally
-        {
-            restoreGraphicsState();
-        }
+        return new TransparencyGroup(form);
     }
 
     /**
@@ -810,10 +795,8 @@ public class PageDrawer extends PDFGraph
 
         /**
          * Creates a buffered image for a transparency group result.
-         *
-         * @param clippingPath clipping path (in current graphics2D coordinates)
          */
-        private TransparencyGroup(GeneralPath clippingPath, PDFormXObject form) throws IOException
+        private TransparencyGroup(PDFormXObject form) throws IOException
         {
             Graphics2D g2dOriginal = graphics;
             Area lastClipOriginal = lastClip;
@@ -821,11 +804,9 @@ public class PageDrawer extends PDFGraph
             // check underlying g2d
 
             Area groupClip = new Area(getGraphicsState().getCurrentClippingPath());
-            if (clippingPath != null)
-            {
-                Area newArea = new Area(clippingPath);            
-                groupClip.intersect(newArea);
-            }
+            Area clippingPath = new Area(new GeneralPath(form.getBBox().toRectangle2D()));
+            Area newArea = new Area(clippingPath);
+            groupClip.intersect(newArea);
 
             AffineTransform at = g2dOriginal.getTransform();
             Shape clippingPathInPixels = at.createTransformedShape(groupClip);
@@ -892,9 +873,7 @@ public class PageDrawer extends PDFGraph
         {
             if (matrix != null)
             {
-                saveGraphicsState();
                 drawBufferedImage(image, matrix.createAffineTransform());
-                restoreGraphicsState();
             }
         }