You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2014/10/14 18:35:22 UTC
svn commit: r1631813 - in
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: pdmodel/PDPage.java
rendering/PDFRenderer.java
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)
{