Author: tilman Date: Tue Oct 14 16:35:21 2014 New Revision: 1631813 URL: http://svn.apache.org/r1631813 Log: PDFBOX-1727: Adjust the cropbox to a smaller mediabox if needed, as pointed out by Jake Robb
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java 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=1631813&r1=1631812&r2=1631813&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 14 16:35:21 2014 @@ -50,7 +50,7 @@ public class PDPage implements COSObject private static final int DEFAULT_USER_SPACE_UNIT_DPI = 72; private static final float MM_TO_UNITS = 1 / (10 * 2.54f) * DEFAULT_USER_SPACE_UNIT_DPI; - private COSDictionary page; + private final COSDictionary page; private PDResources pageResources; /** @@ -124,6 +124,7 @@ public class PDPage implements COSObject * * @return The cos object that matches this Java object. */ + @Override public COSBase getCOSObject() { return page; @@ -537,6 +538,62 @@ public class PDPage implements COSObject page.setItem(COSName.ART_BOX, artBox.getCOSArray()); } } + + /** + * Calculate the adjusted crop box from the cropbox and the mediabox as + * required by the PDF spec. Use this instead of {@link #findCropBox()} + * when drawing a page. + * + * @return the adjusted crop box. + */ + public PDRectangle calcAdjustedCropBox() + { + PDRectangle adjustedCropBox = new PDRectangle(); + + // "the region to which the contents of the page shall be clipped" + PDRectangle tmpCropBox = findCropBox(); + + // "Content falling outside this boundary may safely be discarded" + PDRectangle tmpMediaBox = findMediaBox(); + + // "The crop, bleed, trim, and art boxes shall not ordinarily extend + // beyond the boundaries of the media box. If they do, they are + // effectively reduced to their intersection with the media box. + if (tmpMediaBox.getLowerLeftX() > tmpCropBox.getLowerLeftX()) + { + adjustedCropBox.setLowerLeftX(tmpMediaBox.getLowerLeftX()); + } + else + { + adjustedCropBox.setLowerLeftX(tmpCropBox.getLowerLeftX()); + } + if (tmpMediaBox.getLowerLeftY() > tmpCropBox.getLowerLeftY()) + { + adjustedCropBox.setLowerLeftY(tmpMediaBox.getLowerLeftY()); + } + else + { + adjustedCropBox.setLowerLeftY(tmpCropBox.getLowerLeftY()); + } + if (tmpMediaBox.getUpperRightX() < tmpCropBox.getUpperRightX()) + { + adjustedCropBox.setUpperRightX(tmpMediaBox.getUpperRightX()); + } + else + { + adjustedCropBox.setUpperRightX(tmpCropBox.getUpperRightX()); + } + if (tmpMediaBox.getUpperRightY() < tmpCropBox.getUpperRightY()) + { + adjustedCropBox.setUpperRightY(tmpMediaBox.getUpperRightY()); + } + else + { + adjustedCropBox.setUpperRightY(tmpCropBox.getUpperRightY()); + } + + return adjustedCropBox; + } // todo BoxColorInfo // todo Contents 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=1631813&r1=1631812&r2=1631813&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 14 16:35:21 2014 @@ -122,7 +122,7 @@ public class PDFRenderer { PDPage page = document.getPage(pageIndex); - PDRectangle cropBox = page.findCropBox(); + PDRectangle cropBox = page.calcAdjustedCropBox(); float widthPt = cropBox.getWidth(); float heightPt = cropBox.getHeight(); int widthPx = Math.round(widthPt * scale); @@ -186,7 +186,7 @@ public class PDFRenderer { PDPage page = document.getPage(pageIndex); // TODO need width/wight calculations? should these be in PageDrawer? - PDRectangle cropBox = page.findCropBox(); + PDRectangle cropBox = page.calcAdjustedCropBox(); renderPage(page, graphics, (int)cropBox.getWidth(), (int)cropBox.getHeight(), scale, scale); } @@ -200,7 +200,7 @@ public class PDFRenderer graphics.scale(scaleX, scaleY); // TODO should we be passing the scale to PageDrawer rather than messing with Graphics? - PDRectangle cropBox = page.findCropBox(); + PDRectangle cropBox = page.calcAdjustedCropBox(); int rotationAngle = page.findRotation(); if (rotationAngle != 0) {