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