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)
         {