Author: jahewson Date: Tue Oct 28 17:29:41 2014 New Revision: 1634925 URL: http://svn.apache.org/r1634925 Log: PDFBOX-2423: Fix content stream rectangle clipping
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/PDRectangle.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDGraphicsState.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPrinter.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 pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/gui/PDFPagePanel.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=1634925&r1=1634924&r2=1634925&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 17:29:41 2014 @@ -299,21 +299,17 @@ public class PDFStreamEngine // transform the CTM using the stream's matrix getGraphicsState().getCurrentTransformationMatrix().concatenate(contentStream.getMatrix()); - // bounding box (for clipping) + // clip to bounding box PDRectangle bbox = contentStream.getBBox(); - if (patternBBox !=null) + if (patternBBox != null) { bbox = patternBBox; } if (bbox != null) { - Area clip = new Area(new GeneralPath(new Rectangle(bbox.createDimension()))); - - // content stream space to user space - clip.transform(contentStream.getMatrix().createAffineTransform()); - - // CTM transform (user space => device space) + Area clip = new Area(new GeneralPath(bbox.toRectangle2D())); clip.transform(getGraphicsState().getCurrentTransformationMatrix().createAffineTransform()); + getGraphicsState().intersectClippingPath(clip); } // fixme: stream matrix Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/PDRectangle.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/PDRectangle.java?rev=1634925&r1=1634924&r2=1634925&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/PDRectangle.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/PDRectangle.java Tue Oct 28 17:29:41 2014 @@ -17,6 +17,7 @@ package org.apache.pdfbox.pdmodel.common; import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; import org.apache.pdfbox.cos.COSArray; import org.apache.pdfbox.cos.COSBase; import org.apache.pdfbox.cos.COSFloat; @@ -280,30 +281,8 @@ public class PDRectangle implements COSO } /** - * A convenience method to create a dimension object for AWT operations. - * - * @return A dimension that matches the width and height of this rectangle. + * Returns a copy of this rectangle which has been transformed using the given matrix. */ - public Dimension createDimension() - { - return new Dimension( (int)getWidth(), (int)getHeight() ); - } - - /** - * This will move the rectangle the given relative amount. - * - * @param horizontalAmount positive values will move rectangle to the right, negative's to the left. - * @param verticalAmount positive values will move the rectangle up, negative's down. - */ - public void move(float horizontalAmount, float verticalAmount) - { - setUpperRightX(getUpperRightX() + horizontalAmount); - setLowerLeftX(getLowerLeftX() + horizontalAmount); - setUpperRightY(getUpperRightY() + verticalAmount); - setLowerLeftY(getLowerLeftY() + verticalAmount); - } - - // todo: new public PDRectangle transform(Matrix matrix) { Point2D.Float lowerLeft = matrix.transformPoint(getLowerLeftX(), getLowerLeftY()); @@ -327,6 +306,13 @@ public class PDRectangle implements COSO return rectArray; } + /** + * Returns a new Rectangle2D which is equivalent to this PDRectangle. + */ + public Rectangle2D toRectangle2D() + { + return new Rectangle2D.Float(getLowerLeftX(), getLowerLeftY(), getWidth(), getHeight()); + } /** * This will return a string representation of this rectangle. 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=1634925&r1=1634924&r2=1634925&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 17:29:41 2014 @@ -75,7 +75,7 @@ public class PDGraphicsState implements */ public PDGraphicsState(PDRectangle page) { - clippingPath = new Area(new GeneralPath(new Rectangle(page.createDimension()))); + clippingPath = new Area(new GeneralPath(page.toRectangle2D())); if (page.getLowerLeftX() != 0 || page.getLowerLeftY() != 0) { //Compensate for offset Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPrinter.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPrinter.java?rev=1634925&r1=1634924&r2=1634925&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPrinter.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPrinter.java Tue Oct 28 17:29:41 2014 @@ -307,7 +307,7 @@ public class PDFPrinter // auto portrait/landscape if (orientation == Orientation.AUTO) { - Dimension cropBox = getRotatedCropBox(page).createDimension(); + PDRectangle cropBox = getRotatedCropBox(page); if (cropBox.getWidth() > cropBox.getHeight()) { format.setOrientation(PageFormat.LANDSCAPE); 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=1634925&r1=1634924&r2=1634925&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 17:29:41 2014 @@ -109,9 +109,9 @@ public class PDFRenderer { PDPage page = document.getPage(pageIndex); - PDRectangle adjustedCropBox = page.getCropBox(); - float widthPt = adjustedCropBox.getWidth(); - float heightPt = adjustedCropBox.getHeight(); + PDRectangle cropbBox = page.getCropBox(); + float widthPt = cropbBox.getWidth(); + float heightPt = cropbBox.getHeight(); int widthPx = Math.round(widthPt * scale); int heightPx = Math.round(heightPt * scale); int rotationAngle = page.getRotation(); 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=1634925&r1=1634924&r2=1634925&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 17:29:41 2014 @@ -772,6 +772,13 @@ public class PageDrawer extends PDFGraph } @Override + public void showAnnotation(PDAnnotation annotation) throws IOException + { + lastClip = null; + super.showAnnotation(annotation); + } + + @Override public void showTransparencyGroup(PDFormXObject form) throws IOException { TransparencyGroup group = createTransparencyGroup(form); Modified: pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/gui/PDFPagePanel.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/gui/PDFPagePanel.java?rev=1634925&r1=1634924&r2=1634925&view=diff ============================================================================== --- pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/gui/PDFPagePanel.java (original) +++ pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/tools/gui/PDFPagePanel.java Tue Oct 28 17:29:41 2014 @@ -60,7 +60,7 @@ public class PDFPagePanel extends JPanel this.pageNum = pageNum; PDRectangle cropBox = page.getCropBox(); - drawDimension = cropBox.createDimension(); + drawDimension = new Dimension((int)cropBox.getWidth(), (int)cropBox.getHeight()); int rotation = page.getRotation(); if (rotation == 90 || rotation == 270) {