You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2013/03/03 14:02:03 UTC

svn commit: r1452035 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: PDFReader.java PrintPDF.java pdmodel/PDPageable.java

Author: lehmi
Date: Sun Mar  3 13:02:03 2013
New Revision: 1452035

URL: http://svn.apache.org/r1452035
Log:
PDFBOX-1138: calculate the size of the page to be printed and not of the page to be printed to, use the PDPageable class to print a document

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/PDFReader.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/PrintPDF.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageable.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/PDFReader.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/PDFReader.java?rev=1452035&r1=1452034&r2=1452035&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/PDFReader.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/PDFReader.java Sun Mar  3 13:02:03 2013
@@ -21,6 +21,7 @@ import org.apache.pdfbox.pdfviewer.PageW
 import org.apache.pdfbox.pdfviewer.ReaderBottomPanel;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.PDPageable;
 import org.apache.pdfbox.util.ExtensionFileFilter;
 import org.apache.pdfbox.util.ImageIOUtil;
 
@@ -31,6 +32,7 @@ import javax.swing.KeyStroke;
 
 import java.awt.image.BufferedImage;
 import java.awt.print.PrinterException;
+import java.awt.print.PrinterJob;
 import java.io.File;
 import java.io.IOException;
 import java.util.List;
@@ -134,7 +136,12 @@ public class PDFReader extends javax.swi
                 {
                     if (document != null) 
                     {
-                        document.print();
+                        PDPageable pageable = new PDPageable(document);
+                        PrinterJob job = pageable.getPrinterJob();
+                        if (job.printDialog())
+                        {
+                            job.print();
+                        }
                     }
                 }
                 catch( PrinterException e )

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/PrintPDF.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/PrintPDF.java?rev=1452035&r1=1452034&r2=1452035&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/PrintPDF.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/PrintPDF.java Sun Mar  3 13:02:03 2013
@@ -21,6 +21,7 @@ import java.awt.print.PrinterJob;
 import javax.print.PrintService;
 
 import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPageable;
 
 import java.io.File;
 
@@ -120,13 +121,10 @@ public class PrintPDF
                 }
             }
 
-            if( silentPrint )
+            printJob.setPageable(new PDPageable(document, printJob));
+            if( silentPrint || printJob.printDialog())
             {
-                document.silentPrint( printJob );
-            }
-            else
-            {
-                document.print( printJob );
+                printJob.print();
             }
         }
         finally

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageable.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageable.java?rev=1452035&r1=1452034&r2=1452035&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageable.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPageable.java Sun Mar  3 13:02:03 2013
@@ -16,7 +16,6 @@
  */
 package org.apache.pdfbox.pdmodel;
 
-import static javax.print.attribute.standard.OrientationRequested.LANDSCAPE;
 
 import java.awt.Dimension;
 import java.awt.Graphics;
@@ -25,12 +24,14 @@ import java.awt.print.Pageable;
 import java.awt.print.Paper;
 import java.awt.print.Printable;
 import java.awt.print.PrinterException;
+import java.awt.print.PrinterIOException;
 import java.awt.print.PrinterJob;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.print.PrintService;
-import javax.print.attribute.standard.OrientationRequested;
+import org.apache.pdfbox.pdfviewer.PageDrawer;
+import org.apache.pdfbox.pdmodel.common.PDRectangle;
 
 /**
  * Adapter class that implements the {@link Pageable} and {@link Printable}
@@ -41,7 +42,8 @@ import javax.print.attribute.standard.Or
  * @since Apache PDFBox 1.3.0
  * @see <a href="https://issues.apache.org/jira/browse/PDFBOX-788">PDFBOX-788</a>
  */
-public class PDPageable implements Pageable, Printable {
+public class PDPageable implements Pageable, Printable
+{
 
     /**
      * List of all pages in the given PDF document.
@@ -58,21 +60,26 @@ public class PDPageable implements Pagea
      * printer job.
      *
      * @param document PDF document
-     * @param job printer job
+     * @param printerJob printer job
      * @throws IllegalArgumentException if an argument is <code>null</code>
      * @throws PrinterException if the document permissions prevent printing
      */
-    public PDPageable(PDDocument document, PrinterJob job)
-            throws IllegalArgumentException, PrinterException {
-        if (document == null || job == null) {
+    public PDPageable(PDDocument document, PrinterJob printerJob) throws IllegalArgumentException, PrinterException
+    {
+        if (document == null || printerJob == null)
+        {
             throw new IllegalArgumentException(
-                    "PDPageable(" + document + ", " + job + ")");
-        } else if (!document.getCurrentAccessPermission().canPrint()) {
+                    "PDPageable(" + document + ", " + printerJob + ")");
+        } 
+        else if (!document.getCurrentAccessPermission().canPrint())
+        {
             throw new PrinterException(
                 "You do not have permission to print this document");
-        } else {
+        }
+        else
+        {
             document.getDocumentCatalog().getPages().getAllKids(pages);
-            this.job = job;
+            job = printerJob;
         }
     }
 
@@ -84,8 +91,8 @@ public class PDPageable implements Pagea
      * @throws IllegalArgumentException if the argument is <code>null</code>
      * @throws PrinterException if the document permissions prevent printing
      */
-    public PDPageable(PDDocument document)
-            throws IllegalArgumentException, PrinterException {
+    public PDPageable(PDDocument document) throws IllegalArgumentException, PrinterException
+    {
         this(document, PrinterJob.getPrinterJob());
     }
 
@@ -94,7 +101,8 @@ public class PDPageable implements Pagea
      *
      * @return printer job
      */
-    public PrinterJob getPrinterJob() {
+    public PrinterJob getPrinterJob()
+    {
         return job;
     }
 
@@ -105,7 +113,8 @@ public class PDPageable implements Pagea
      *
      * @return number of pages
      */
-    public int getNumberOfPages() {
+    public int getNumberOfPages()
+    {
         return pages.size();
     }
 
@@ -116,7 +125,8 @@ public class PDPageable implements Pagea
      * @return page format
      * @throws IndexOutOfBoundsException if the page index is invalid
      */
-    public PageFormat getPageFormat(int i) throws IndexOutOfBoundsException {
+    public PageFormat getPageFormat(int i) throws IndexOutOfBoundsException
+    {
         PageFormat format = job.defaultPage();
 
         PDPage page = pages.get(i); // can throw IOOBE
@@ -126,25 +136,22 @@ public class PDPageable implements Pagea
         // Center the ImageableArea if the crop is smaller than the media
         double diffWidth = 0.0;
         double diffHeight = 0.0;
-        if (!media.equals(crop)) {
+        if (!media.equals(crop))
+        {
             diffWidth = (media.getWidth() - crop.getWidth()) / 2.0;
             diffHeight = (media.getHeight() - crop.getHeight()) / 2.0;
         }
 
         Paper paper = format.getPaper();
-        PrintService service = job.getPrintService(); // can be null
-        Class<OrientationRequested> orientation = OrientationRequested.class;
-        if (service != null
-                && service.getDefaultAttributeValue(orientation) == LANDSCAPE) {
-           format.setOrientation(PageFormat.LANDSCAPE);
-           paper.setImageableArea(
-                   diffHeight, diffWidth, crop.getHeight(), crop.getWidth());
-           paper.setSize(media.getHeight(), media.getWidth());
-        } else {
-           format.setOrientation(PageFormat.PORTRAIT);
-           paper.setImageableArea(
-                   diffWidth, diffHeight, crop.getWidth(), crop.getHeight());
-           paper.setSize(media.getWidth(), media.getHeight());
+        if (media.getWidth() < media.getHeight())
+        {
+          format.setOrientation(PageFormat.PORTRAIT);
+          paper.setImageableArea(diffWidth, diffHeight, crop.getWidth(), crop.getHeight());
+        }
+        else
+        {
+          format.setOrientation(PageFormat.LANDSCAPE);
+          paper.setImageableArea(diffHeight, diffWidth, crop.getHeight(), crop.getWidth());
         }
         format.setPaper(paper);
 
@@ -161,7 +168,8 @@ public class PDPageable implements Pagea
      * @return printable
      * @throws IndexOutOfBoundsException if the page index is invalid
      */
-    public Printable getPrintable(int i) throws IndexOutOfBoundsException {
+    public Printable getPrintable(int i) throws IndexOutOfBoundsException
+    {
         return pages.get(i);
     }
 
@@ -177,12 +185,25 @@ public class PDPageable implements Pagea
      *         or {@link Printable#NO_SUCH_PAGE} if page index was invalid
      * @throws PrinterException if printing failed
      */
-    @SuppressWarnings("deprecation")
-    public int print(Graphics graphics, PageFormat format, int i)
-            throws PrinterException {
-        if (0 <= i && i < pages.size()) {
-            return pages.get(i).print(graphics, format, i);
-        } else {
+    public int print(Graphics graphics, PageFormat format, int i) throws PrinterException
+    {
+        if (0 <= i && i < pages.size())
+        {
+            try
+            {
+                PDPage page = pages.get(i);
+                PDRectangle cropBox = page.findCropBox();
+                PageDrawer drawer = new PageDrawer();
+                drawer.drawPage( graphics, page, cropBox.createDimension() );
+                return PAGE_EXISTS;
+            }
+            catch( IOException io )
+            {
+                throw new PrinterIOException( io );
+            }
+        }
+        else
+        {
             return NO_SUCH_PAGE;
         }
     }