package com.co.lane.print; import java.awt.print.Book; import java.awt.print.PageFormat; import java.awt.print.Paper; import java.awt.print.PrinterJob; import java.util.List; import com.co.lane.util.ConfigUtil; import com.co.lane.util.ConfigUtilHelper; import com.co.lane.util.StringUtil; /** * 打印处理流程: * <pre> * 打印预处理,纸张设置等初始化 * 创建打印纸张对象 * 数据转换处理 * 创建打印服务对象,并设置打印文档 * 打印处理 * <pre> * @author Xuyd */ public class Printer{ /** * 毫米和pt之间换算 * 1mm = 72/25.4 = 2.8346pt * * <pre> * 在默认72dpi的打印机上的比例。 * A4(595 * 842)pt * * 1mm = 2.8346pt * 1英寸 = 25.4mm * 1英寸 = 72点 * 1mm = 72 / 25.4 = 2.83pt * 615px = 217.31mm = 615pt * 380px = 124.28mm = 380pt * </pre> */ public static double rate= 2.8346d; /** * 配置文件路径 */ private String coifigFilePath = null; /** * 原始的打印数据 */ private Object printDataOriginal = new Object(); /** * 配置文件对象 */ private ConfigDataBean configData = new ConfigDataBean(); /** * 空构造器 * * @param none */ public Printer() { } /** * 设置原始打印数据 * * @param printDataOriginal */ public Printer(String coifigFilePath, Object printDataOriginal) { this.coifigFilePath = coifigFilePath; this.printDataOriginal = printDataOriginal; } /** * 配置文件处理 * * @param none */ public void initPrintConfig(){ ConfigUtil configUtil = ConfigUtilHelper.load(coifigFilePath); // TODO 以后这里作成@Annotation方式直接在字段上加@XmlElement(xpath="/PrintMode/General/Item")方式。 List<ConfigDataItem> listGeneralItem = configUtil.getListByXPath(ConfigDataItem.class, "/PrintMode/General/Item"); List<ConfigDataItem> listHeaderItem = configUtil.getListByXPath(ConfigDataItem.class, "/PrintMode/Header/Item"); List<ConfigDataItem> listDetailItem = configUtil.getListByXPath(ConfigDataItem.class, "/PrintMode/Detail/Item"); List<ConfigDataItem> listTotalItem = configUtil.getListByXPath(ConfigDataItem.class, "/PrintMode/Total/Item"); List<ConfigDataItem> listDetail1Item = configUtil.getListByXPath(ConfigDataItem.class, "/PrintMode/Detail1/Item"); List<ConfigDataItem> listTotal1Item = configUtil.getListByXPath(ConfigDataItem.class, "/PrintMode/Total1/Item"); List<ConfigDataItem> listPayItem = configUtil.getListByXPath(ConfigDataItem.class, "/PrintMode/Pay/Item"); List<ConfigDataItem> listBottomItem = configUtil.getListByXPath(ConfigDataItem.class, "/PrintMode/Botton/Item"); configData.setListGeneralItem(listGeneralItem); configData.setListHeaderItem(listHeaderItem); configData.setListDetailItem(listDetailItem); configData.setListTotalItem(listTotalItem); configData.setListDetail1Item(listDetail1Item); configData.setListTotal1Item(listTotal1Item); configData.setListPayItem(listPayItem); configData.setListBottomItem(listBottomItem); } /** * 创建打印纸张对象,从配置文件中获取纸张大小,打印区域等属性<br> * 纸张大小(595, 842)表示A4纸(单位:1/72英寸) * * @return Paper */ public Paper initPaper() { ConfigDataItem item = null; item = this.configData.getListGeneralItem().get(0); double imageableWidth = item.getWidth(); item = this.configData.getListGeneralItem().get(1); double imageableHeight = item.getWidth(); // 必须与实际打印纸张大小相符,页边空白为一英寸。 Paper paper = new Paper(); double originalX = 3; // double originalY = 5; // 不能为0 // 通过Paper设置页面的空白边距和可打印区域。 // A4(595X842)设置打印区域,其实0,0应该是72*72点,因为A4纸的默认X,Y边距是一英寸 // A4纸的大小为210mm*297mm,1英寸为25.4毫米 // ============== default setting(x=72,y=72) NG====== // paper size采用默认 ========================NG====== // paper.setSize(590, 380) ==================NG====== // paper.setSize(590, 840)表示A4纸 ===========OK====== paper.setSize(590, 840); paper.setImageableArea(originalX, originalY, imageableWidth * rate, imageableHeight * rate); return paper; } /** * 打印预处理,纸张设置等初始化,创建打印服务对象,并设置打印文档。 * * @param none */ public Book initBook(){ // 配置文件处理 initPrintConfig(); // 创建打印文档 Book book = new Book(); // 创建打印格式属性 PageFormat pageFormat = new PageFormat(); // 创建打印纸张 Paper paper = this.initPaper(); pageFormat.setPaper(paper); // 把 PageFormat 和 Printable 添加到打印文档中,组成一个页面 PrinterExec printExec = new PrinterExec(configData, printDataOriginal); book.append(printExec, pageFormat); return book; } /** * 打印处理 * * @param none * * @return 打印成功...true,打印失败...false,抛出PrinterExException异常 * @throws PrinterExException */ public boolean print() { Book book = this.initBook(); // 获取所有打印机服务 javax.print.PrintService[] arrPrintService = javax.print.PrintServiceLookup.lookupPrintServices(null, null); if(arrPrintService == null || arrPrintService.length == 0){ throw new PrinterExException("无法获取到打印机,请确认打印服务启动,或者正确安装了打印机。"); // logger.error("无法获取到打印机,请确认打印服务启动,或者正确安装了打印机。"); // return false; } for(javax.print.PrintService ps: arrPrintService){ StringUtil.trace(ps.getName()); } // 获取打印服务对象 PrinterJob job = PrinterJob.getPrinterJob(); // 设置打印类 job.setPageable(book); try { // if(job.printDialog()){ job.print(); // } } catch (Exception e) { throw new PrinterExException(e); // logger.error(e.getMessage()); // return false; } return true; } /** * @param coifigFilePath the coifigFilePath to set */ public void setCoifigFilePath(String coifigFilePath) { this.coifigFilePath = coifigFilePath; } /** * @param configData the configData to set */ public void setConfigData(ConfigDataBean configData) { this.configData = configData; } /** * @param printDataOriginal the printDataOriginal to set */ public void setPrintDataOriginal(Object printDataOriginal) { this.printDataOriginal = printDataOriginal; } }