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); }