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