Author: jahewson
Date: Mon Aug 10 22:48:57 2015
New Revision: 1695180

URL: http://svn.apache.org/r1695180
Log:
PDFBOX-2922: Correct printing of landscape pages with landscape-sized paper

Modified:
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPageable.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPageable.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPageable.java?rev=1695180&r1=1695179&r2=1695180&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPageable.java 
(original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPageable.java 
Mon Aug 10 22:48:57 2015
@@ -17,8 +17,8 @@
 
 package org.apache.pdfbox.printing;
 
+import java.awt.print.Book;
 import java.awt.print.PageFormat;
-import java.awt.print.Pageable;
 import java.awt.print.Paper;
 import java.awt.print.Printable;
 import org.apache.pdfbox.pdmodel.PDDocument;
@@ -30,7 +30,7 @@ import org.apache.pdfbox.pdmodel.common.
  *
  * @author John Hewson
  */
-public final class PDFPageable implements Pageable
+public final class PDFPageable extends Book
 {
     private final PDDocument document;
     private final boolean showPageBorder;
@@ -107,10 +107,31 @@ public final class PDFPageable implement
         PDRectangle mediaBox = page.getMediaBox();
         PDRectangle cropBox = PDFPrintable.getRotatedCropBox(page);
         
-        Paper paper = new Paper();
-        paper.setSize(mediaBox.getWidth(), mediaBox.getHeight());
-        paper.setImageableArea(cropBox.getLowerLeftX(), 
cropBox.getLowerLeftY(),
-                               cropBox.getWidth(), cropBox.getHeight());
+        // Java does not seem to understand landscape paper sizes, i.e. where 
width > height, it
+        // always crops the imageable area as if the page were in portrait. I 
suspect that this is
+        // a JDK bug but it might be by design, see PDFBOX-2922.
+        //
+        // As a workaround, we normalise all Page(s) to be portrait, then flag 
them as landscape in
+        // the PageFormat.
+        Paper paper;
+        boolean isLandscape;
+        if (mediaBox.getWidth() > mediaBox.getHeight())
+        {
+            // rotate
+            paper = new Paper();
+            paper.setSize(mediaBox.getHeight(), mediaBox.getWidth());
+            paper.setImageableArea(cropBox.getLowerLeftY(), 
cropBox.getLowerLeftX(),
+                    cropBox.getHeight(), cropBox.getWidth());
+            isLandscape = true;
+        }
+        else
+        {
+            paper = new Paper();
+            paper.setSize(mediaBox.getWidth(), mediaBox.getHeight());
+            paper.setImageableArea(cropBox.getLowerLeftX(), 
cropBox.getLowerLeftY(),
+                    cropBox.getWidth(), cropBox.getHeight());
+            isLandscape = false;
+        }
 
         PageFormat format = new PageFormat();
         format.setPaper(paper);
@@ -118,7 +139,7 @@ public final class PDFPageable implement
         // auto portrait/landscape
         if (orientation == Orientation.AUTO)
         {
-            if (cropBox.getWidth() > cropBox.getHeight())
+            if (isLandscape)
             {
                 format.setOrientation(PageFormat.LANDSCAPE);
             }


Reply via email to