package com.billion.main.print; import javax.print.*; import javax.print.attribute.standard.PrinterName; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; /** * 样式调整网址,http://labelary.com/viewer.html */ public class ZplPrinter { private String printerURI = null; //打印机完整路径 private PrintService printService = null; //打印机服务 private byte[] dotFont; private String darkness = "~SD22"; //Set Darkness设置色带颜色的深度 0-30 private String width = "^PW1200"; //Print Width打印宽度0-1500 private String length = "^LL800"; //Label Length标签长度0-x(暂无作用) private String begin = "^XA" + darkness + width; //标签格式以^XA开始 private String end = "^XZ"; //标签格式以^XZ结束 private String content = ""; //打印内容 private String message = ""; //打印的结果信息 /** * 构造方法 * * @param printerURI 打印机路径 */ public ZplPrinter(String printerURI) { this.printerURI = printerURI; //加载字体 File file = new File("D:\\cowain\\ts24.lib"); if (file.exists()) { FileInputStream fis; try { fis = new FileInputStream(file); dotFont = new byte[fis.available()]; fis.read(dotFont); fis.close(); } catch (IOException e) { e.printStackTrace(); } } else { System.out.println("ts24.lib文件不存在"); } //初始化打印机 //AppContext.getAppContext().put(PrintServiceLookup.class.getDeclaredClasses()[0], null);//刷新打印机列表 PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null); if (services != null && services.length > 0) { for (PrintService service : services) { if (printerURI.equals(service.getName())) { printService = service; break; } } } if (printService == null) { System.out.println("没有找到打印机:[" + printerURI + "]"); //循环出所有的打印机 if (services != null && services.length > 0) { System.out.println("可用的打印机列表:"); for (PrintService service : services) { System.out.println("[" + service.getName() + "]"); } } } else { System.out.println("找到打印机:[" + printerURI + "]"); System.out.println("打印机名称:[" + printService.getAttribute(PrinterName.class).getValue() + "]"); } } /** * 设置条形码 * * @param barcode 条码字符 * @param zpl 条码样式模板 */ public void setBarcode(String barcode, String zpl) { content += zpl.replace("${data}", barcode); } /** * 中文字符、英文字符(包含数字)混合 * * @param str 中文、英文 * @param x x坐标 * @param y y坐标 * @param eh 英文字体高度height * @param ew 英文字体宽度width * @param es 英文字体间距spacing * @param mx 中文x轴字体图形放大倍率。范围1-10,默认1 * @param my 中文y轴字体图形放大倍率。范围1-10,默认1 * @param ms 中文字体间距。24是个比较合适的值。 */ public void setText(String str, int x, int y, int eh, int ew, int es, int mx, int my, int ms) { byte[] ch = str2bytes(str); for (int off = 0; off < ch.length; ) { if (((int) ch[off] & 0x00ff) >= 0xA0) {//中文字符 try { int qcode = ch[off] & 0xff; int wcode = ch[off + 1] & 0xff; content += String.format("^FO%d,%d^XG0000%01X%01X,%d,%d^FS\n", x, y, qcode, wcode, mx, my); begin += String.format("~DG0000%02X%02X,00072,003,\n", qcode, wcode); qcode = (qcode + 128 - 32) & 0x00ff; wcode = (wcode + 128 - 32) & 0x00ff; int offset = ((int) qcode - 16) * 94 * 72 + ((int) wcode - 1) * 72; for (int j = 0; j < 72; j += 3) { qcode = (int) dotFont[j + offset] & 0x00ff; wcode = (int) dotFont[j + offset + 1] & 0x00ff; int qcode1 = (int) dotFont[j + offset + 2] & 0x00ff; begin += String.format("%02X%02X%02X\n", qcode, wcode, qcode1); } x = x + ms * mx; off = off + 2; } catch (Exception e) { e.printStackTrace(); //替换成X号 setChar("X", x, y, eh, ew); x = x + es;//注意间距更改为英文字符间距 off = off + 2; } } else if (((int) ch[off] & 0x00FF) < 0xA0) {//英文字符 setChar(String.format("%c", ch[off]), x, y, eh, ew); x = x + es; off++; } } } /** * 英文字符串(包含数字) * * @param str 英文字符串 * @param x x坐标 * @param y y坐标 * @param h 高度 * @param w 宽度 */ public void setChar(String str, int x, int y, int h, int w) { content += "^FO" + x + "," + y + "^A0," + h + "," + w + "^FD" + str + "^FS"; } /** * 获取完整的ZPL * * @return */ public String getZpl() { return begin + content + end; } /** * 重置ZPL指令,当需要打印多张纸的时候需要调用。 */ public void resetZpl() { begin = "^XA" + darkness + width; end = "^XZ"; content = ""; } /** * 打印 * * @param zpl 完整的ZPL */ public boolean print(String zpl) { if (printService == null) { message = "打印出错:没有找到打印机[" + printerURI + "]"; System.out.println("打印出错:没有找到打印机[" + printerURI + "]"); return false; } DocPrintJob job = printService.createPrintJob(); byte[] by = zpl.getBytes(); DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE; Doc doc = new SimpleDoc(by, flavor, null); try { job.print(doc, null); message = "已打印"; System.out.println("已打印"); return true; } catch (PrintException e) { message = "打印出错:" + e.getMessage(); System.out.println("打印出错:" + e.getMessage()); e.printStackTrace(); return false; } } public String getMessage() { return message; } /** * 字符串转byte[] * * @param s * @return */ private byte[] str2bytes(String s) { if (null == s || "".equals(s)) { return null; } byte[] abytes = null; try { abytes = s.getBytes("gb2312"); } catch (UnsupportedEncodingException ex) { ex.printStackTrace(); } return abytes; } }