/* * JasperReports - Free Java Reporting Library. * Copyright (C) 2001 - 2009 Jaspersoft Corporation. All rights reserved. * http://www.jaspersoft.com * * Unless you have purchased a commercial license agreement from Jaspersoft, * the following license terms apply: * * This program is part of JasperReports. * * JasperReports is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * JasperReports is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with JasperReports. If not, see <http://www.gnu.org/licenses/>. */ package net.sf.jasperreports.engine.print; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.print.Book; import java.awt.print.PageFormat; import java.awt.print.Paper; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import javax.print.PrintService; import javax.print.PrintServiceLookup; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.JRReport; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.export.JRGraphics2DExporter; import net.sf.jasperreports.engine.export.JRGraphics2DExporterParameter; import net.sf.jasperreports.engine.util.JRGraphEnvInitializer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.floreantpos.config.PrintConfig; /** * @author Teodor Danciu (teodord@users.sourceforge.net) * @version $Id: JRPrinterAWT.java 3124 2009-10-12 20:49:43Z lucianc $ */ public class JRPrinterAWT implements Printable { private static final Log log = LogFactory.getLog(JRPrinterAWT.class); public static boolean printToKitchen; /** * */ private JasperPrint jasperPrint = null; private int pageOffset = 0; /** * */ protected JRPrinterAWT(JasperPrint jrPrint) throws JRException { JRGraphEnvInitializer.initializeGraphEnv(); jasperPrint = jrPrint; } /** * */ public static boolean printPages(JasperPrint jrPrint, int firstPageIndex, int lastPageIndex, boolean withPrintDialog) throws JRException { JRPrinterAWT printer = new JRPrinterAWT(jrPrint); return printer.printPages(firstPageIndex, lastPageIndex, withPrintDialog); } /** * */ public static Image printPageToImage(JasperPrint jrPrint, int pageIndex, float zoom) throws JRException { JRPrinterAWT printer = new JRPrinterAWT(jrPrint); return printer.printPageToImage(pageIndex, zoom); } /** * */ private boolean printPages(int firstPageIndex, int lastPageIndex, boolean withPrintDialog) throws JRException { boolean isOK = true; if (firstPageIndex < 0 || firstPageIndex > lastPageIndex || lastPageIndex >= jasperPrint.getPages().size()) { throw new JRException("Invalid page index range : " + firstPageIndex + " - " + lastPageIndex + " of " + jasperPrint.getPages().size()); } pageOffset = firstPageIndex; PrinterJob printJob = PrinterJob.getPrinterJob(); // fix for bug ID 6255588 from Sun bug database initPrinterJobFields(printJob); PageFormat pageFormat = printJob.defaultPage(); Paper paper = pageFormat.getPaper(); printJob.setJobName("JasperReports - " + jasperPrint.getName()); switch (jasperPrint.getOrientation()) { case JRReport.ORIENTATION_LANDSCAPE: { pageFormat.setOrientation(PageFormat.LANDSCAPE); paper.setSize(jasperPrint.getPageHeight(), jasperPrint.getPageWidth()); paper.setImageableArea(0, 0, jasperPrint.getPageHeight(), jasperPrint.getPageWidth()); break; } case JRReport.ORIENTATION_PORTRAIT: default: { pageFormat.setOrientation(PageFormat.PORTRAIT); paper.setSize(jasperPrint.getPageWidth(), jasperPrint.getPageHeight()); paper.setImageableArea(0, 0, jasperPrint.getPageWidth(), jasperPrint.getPageHeight()); } } pageFormat.setPaper(paper); Book book = new Book(); book.append(this, pageFormat, lastPageIndex - firstPageIndex + 1); printJob.setPageable(book); try { if (withPrintDialog) { if (printJob.printDialog()) { printJob.print(); } else { isOK = false; } } else { printJob.print(); } } catch (Exception ex) { throw new JRException("Error printing report.", ex); } return isOK; } /** * */ public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { if (Thread.interrupted()) { throw new PrinterException("Current thread interrupted."); } pageIndex += pageOffset; if (pageIndex < 0 || pageIndex >= jasperPrint.getPages().size()) { return Printable.NO_SUCH_PAGE; } try { JRGraphics2DExporter exporter = new JRGraphics2DExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, this.jasperPrint); exporter.setParameter(JRGraphics2DExporterParameter.GRAPHICS_2D, graphics); exporter.setParameter(JRExporterParameter.PAGE_INDEX, new Integer(pageIndex)); exporter.exportReport(); } catch (JRException e) { if (log.isDebugEnabled()) log.debug("Print failed.", e); throw new PrinterException(e.getMessage()); } return Printable.PAGE_EXISTS; } /** * */ private Image printPageToImage(int pageIndex, float zoom) throws JRException { Image pageImage = new BufferedImage((int) (jasperPrint.getPageWidth() * zoom) + 1, (int) (jasperPrint.getPageHeight() * zoom) + 1, BufferedImage.TYPE_INT_RGB); JRGraphics2DExporter exporter = new JRGraphics2DExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, this.jasperPrint); exporter.setParameter(JRGraphics2DExporterParameter.GRAPHICS_2D, pageImage.getGraphics()); exporter.setParameter(JRExporterParameter.PAGE_INDEX, new Integer(pageIndex)); exporter.setParameter(JRGraphics2DExporterParameter.ZOOM_RATIO, new Float(zoom)); exporter.exportReport(); return pageImage; } /** * Fix for bug ID 6255588 from Sun bug database * @param job print job that the fix applies to */ public static void initPrinterJobFields(PrinterJob job) { try { PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null); PrintService printService = PrintServiceLookup.lookupDefaultPrintService(); String printerName = PrintConfig.getOsReceiptPrinterName(); if(printToKitchen) { printerName = PrintConfig.getOsKitchenPrinterName(); } for (int i = 0; i < printServices.length; i++) { PrintService service = printServices[i]; if(service.getName().equals(printerName)) { printService = service; break; } } job.setPrintService(printService); printToKitchen = false; } catch (PrinterException e) { } } public static long getImageSize(JasperPrint jasperPrint, float zoom) { int width = (int) (jasperPrint.getPageWidth() * zoom) + 1; int height = (int) (jasperPrint.getPageHeight() * zoom) + 1; return width * height; } }