1 17 18 19 20 package org.apache.fop.render.print; 21 22 import java.awt.geom.Rectangle2D ; 23 import java.awt.print.PageFormat ; 24 import java.awt.print.Pageable ; 25 import java.awt.print.Paper ; 26 import java.awt.print.Printable ; 27 import java.awt.print.PrinterException ; 28 import java.awt.print.PrinterJob ; 29 import java.io.IOException ; 30 import java.util.Vector ; 31 32 import org.apache.fop.apps.FOPException; 33 import org.apache.fop.render.java2d.Java2DRenderer; 34 35 41 public class PrintRenderer extends Java2DRenderer implements Pageable { 42 43 private static final int EVEN_AND_ALL = 0; 44 45 private static final int EVEN = 1; 46 47 private static final int ODD = 2; 48 49 private int startNumber = 0; 50 51 private int endNumber = -1; 52 53 private int mode = EVEN_AND_ALL; 54 55 private int copies = 1; 56 57 private PrinterJob printerJob; 58 59 62 public PrintRenderer() { 63 initializePrinterJob(); 64 } 65 66 71 public PrintRenderer(PrinterJob printerJob) { 72 this.printerJob = printerJob; 73 printerJob.setPageable(this); 74 } 75 76 private void initializePrinterJob() throws IllegalArgumentException { 77 copies = getIntProperty("copies", 1); 79 startNumber = getIntProperty("start", 1) - 1; 80 endNumber = getIntProperty("end", -1); 81 String str = System.getProperty("even"); 82 if (str != null) { 83 mode = Boolean.valueOf(str).booleanValue() ? EVEN : ODD; 84 } 85 86 printerJob = PrinterJob.getPrinterJob(); 87 printerJob.setJobName("FOP Document"); 88 printerJob.setCopies(copies); 89 if (System.getProperty("dialog") != null) { 90 if (!printerJob.printDialog()) { 91 throw new IllegalArgumentException ( 92 "Printing cancelled by operator"); 93 } 94 } 95 printerJob.setPageable(this); 96 } 97 98 99 public PrinterJob getPrinterJob() { 100 return this.printerJob; 101 } 102 103 104 public int getEndNumber() { 105 return endNumber; 106 } 107 108 112 public void setEndPage(int end) { 113 this.endNumber = end; 114 } 115 116 117 public int getStartPage() { 118 return startNumber; 119 } 120 121 125 public void setStartPage(int start) { 126 this.startNumber = start; 127 } 128 129 public void stopRenderer() throws IOException { 130 super.stopRenderer(); 131 132 if (endNumber == -1) { 133 endNumber = getNumberOfPages(); 135 } 136 137 Vector numbers = getInvalidPageNumbers(); 138 for (int i = numbers.size() - 1; i > -1; i--) { 139 } 141 142 try { 143 printerJob.print(); 144 } catch (PrinterException e) { 145 log.error(e); 146 throw new IOException ("Unable to print: " + e.getClass().getName() 147 + ": " + e.getMessage()); 148 } 149 clearViewportList(); 150 } 151 152 public static int getIntProperty(String name, int def) { 153 String propValue = System.getProperty(name); 154 if (propValue != null) { 155 try { 156 return Integer.parseInt(propValue); 157 } catch (Exception e) { 158 return def; 159 } 160 } else { 161 return def; 162 } 163 } 164 165 private Vector getInvalidPageNumbers() { 166 Vector vec = new Vector (); 167 int max = getNumberOfPages(); 168 boolean isValid; 169 for (int i = 0; i < max; i++) { 170 isValid = true; 171 if (i < startNumber || i > endNumber) { 172 isValid = false; 173 } else if (mode != EVEN_AND_ALL) { 174 if (mode == EVEN && ((i + 1) % 2 != 0)) { 175 isValid = false; 176 } else if (mode == ODD && ((i + 1) % 2 != 1)) { 177 isValid = false; 178 } 179 } 180 181 if (!isValid) { 182 vec.add(Integer.toString(i)); 183 } 184 } 185 return vec; 186 } 187 188 189 public PageFormat getPageFormat(int pageIndex) 190 throws IndexOutOfBoundsException { 191 try { 192 if (pageIndex >= getNumberOfPages()) { 193 return null; 194 } 195 196 PageFormat pageFormat = new PageFormat (); 197 198 Paper paper = new Paper (); 199 200 Rectangle2D dim = getPageViewport(pageIndex).getViewArea(); 201 double width = dim.getWidth(); 202 double height = dim.getHeight(); 203 204 if (width > height) { 207 paper.setImageableArea(0, 0, height / 1000d, width / 1000d); 208 paper.setSize(height / 1000d, width / 1000d); 209 pageFormat.setOrientation(PageFormat.LANDSCAPE); 210 } else { 211 paper.setImageableArea(0, 0, width / 1000d, height / 1000d); 212 paper.setSize(width / 1000d, height / 1000d); 213 pageFormat.setOrientation(PageFormat.PORTRAIT); 214 } 215 pageFormat.setPaper(paper); 216 return pageFormat; 217 } catch (FOPException fopEx) { 218 throw new IndexOutOfBoundsException (fopEx.getMessage()); 219 } 220 } 221 222 public Printable getPrintable(int pageIndex) 223 throws IndexOutOfBoundsException { 224 return this; 225 } 226 } 227 | Popular Tags |