使用斑马打印机专门的打印命令ZPL语言进行VIN码打印1. 斑马打印机驱动的设置(1)使用的打印纸大概为------6.5cm*1.3cm(2)设置Paper Size的大小为6.5cm*1.3cm-----使用的是用户自定义大小(3)设置打印的浓度Printer Darkness 为10(默认为10)---可使用打印命令^MD16设置打印浓度(4)设置Printer Actions 设置如下所示,具体作用不是很清楚2.ZPL命令简单使用(1)^XA 和^XZ 是开始和结束标记(2)^MD30 设置色带颜色的深度取值范围从-30到30,30为最深颜色深度(3)^LH 设置条码纸的边距(4)^FO 设置条码左上角的位置0,0 代表完全不留边距(5)^ACN设置字体.^ACN是设置字体的. 因为在条码下方会显示该条码的内容, 所以这里要设一下字体. 这个字体跟条码无关.^Afo,h,w(6)^BY是设置条码样式^BY命令的格式:改变条码默认参数^Byw,r,hw 模块(窄条)宽开机初始化值:2点可接受的数值:1-10点r 宽条与窄条的比例开机初始化值:3.0 可接受的数值:2.0到3.0,0.1的增量(对固定比例的条码无效)效)h 条码高度开机初始化值:10点可接受的数值:1点到标签高度(7)^BC是打印code128的指令(8)^FD设置要打印的内容, ^FS表示换行.(9)^XG命令用于调用一个或多个要进行打印的图形图像(10)~DGd:o.x,t,w,data ~DG 命令用于下载以ASCII 十六进制表示的图形图像(11)^FWr,z 用于为所有具有旋转方向的命令字段设置默认方向(12)^TBa,b,c 用于打印具有定义的宽度和高度的文本块(13)^FT 命令用于设置字段位置(14)^FN 命令用于对数据字段进行编号2.VIN(17位)条形码打印,中文打印---使用ZPL语言即命令来实现Zebra打印机打印条形码(1)使用ZPL语言实现打印,下面是实现函数ZebraPrintimport java.io.File;import java.io.FileInputStream;import java.io.UnsupportedEncodingException;import javax.print.Doc;import javax.print.DocFlavor;import javax.print.DocPrintJob;import javax.print.PrintException;import javax.print.PrintService;import javax.print.PrintServiceLookup;import javax.print.SimpleDoc;public class ZebraPrint {byte[] dotfont;String s_prt = "^XA,^MD16^FWN,2", s_prt_buffer="";//^XA打印开始标志^MD打印浓度为30(-30~30) ^ABN,30,30设置字体大小// 长,宽//测试public static void main(String[] args) {try {ZebraPrint a = new ZebraPrint();a.setCommand("LNBMDLAA8CU000245");printCN("发动机名称:QWFWEQFEFQFSFA", 100, 150,20,20,1);printCN("发动机所属订单号:ASDFDSSAFADSF", 100, 180,20,20,1);String str = a.getCommand();System.out.println(str);a.print(str );} catch (Exception e) {e.printStackTrace();}}public ZebraPrint() throws Exception {//加载24×24点阵字体库//以流的形式下载文件,ts24.lib是指要下载文件的路径File file = new File(System.getProperty("user.dir")+"\\src\\resources\\ts24.lib");FileInputStream fis = new FileInputStream(file);//创建一个刚刚好的缓冲区//fis.available()获取关联的文件的字节数,文件体积不是很大可以这样操作dotfont = new byte[fis.available()];fis.read(dotfont);fis.close();}public void setCommand(String barcode) {printBarcode(barcode, 100, 40); //打印之后能够正确扫描}public void setCommand(String barcode,int x, int y,String fontType,int fontX,int fontY,intthinBarcode,int times,int height) {printBarcode(barcode,x,y,fontType,fontX,fontY,thinBarcode,times,height); //打印之后能够正确扫描}public String getCommand() {return s_prt + s_prt_buffer+"^XZ";//^XZ 打印结束}public void print(String str) throws PrintException {PrintService psZebra = PrintServiceLookup.lookupDefaultPrintService();if (psZebra == null) {System.out.println("没有发现条码打印机.");return;}DocPrintJob job = psZebra.createPrintJob();byte[] by = str.getBytes();DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;Doc doc = new SimpleDoc(by, flavor, null);job.print(doc, null);}/*** 打印条形码* @param barcode 字符串* @param xx x坐标* @param yy y坐标* @param fontX 字体高度单位:dots* @param fontY 字体宽度* @param thinBarcode 窄条宽度单位:dots 可接受的数值:1-10点* @param times 宽条与窄条的比例可接受的数值:2到3.0,0.1的增量(对固定比例的条码无效)* @param height 高度可接受的数值:1点到标签高度** 命令:* ^FDa 参数a代表要打印的数据^FO 设置条码位置^FD设置要打印的内容, ^FS表示换行^BY命令的格式:改变条码默认参数^Byw,r,hw 模块(窄条)宽开机初始化值:2点可接受的数值:1-10点r 宽条与窄条的比例开机初始化值:3.0 可接受的数值:2.0到3.0,0.1的增量(对固定比例的条码无效)h 条码高度开机初始化值:10点可接受的数值:1点到标签高度*/protected void printBarcode(String barcode,int x, int y,String fontType,int fontX,int fontY,int thinBarcode,int times,int height) {System.out.println(barcode);s_prt_buffer += "^FO"+x+","+y+"^A"+fontType+"N,"+fontX+","+fontY+"^BY"+thinBarcode+","+times+","+height+"^BCN,,Y,N^FD" + barcode + "^FS\n";}protected void printBarcode(String barcode,int x, int y) {System.out.println(barcode);// s_prt_buffer += "^BY3^FS^FO"+x+","+y+"^BEN,"+h+"^FD" + barcode + "\n";s_prt_buffer += "^FO"+x+","+y+"^A5N,22,22^BY2,3,100^BCN,,Y,N,N^FD" + barcode + "^FS\n";//可以打印出条码和注释等宽}/*** 打印英文字符,数字* @param str* @param x 距左顶角沿X轴的距离(原点)单位:dots* @param y 距左顶角沿Y轴的距离(原点)单位:dots* @param h 字体高度* @param w 字体宽度*/protected void printChar(String str,int x, int y,int h,int w) {System.out.println(str);s_prt_buffer +="^FO"+x+","+y+"^A0,"+h+","+w+"^FD"+str+"^FS";}//字符旋转90度protected void printCharR(String str,int x, int y,int h,int w) {System.out.println(str);s_prt_buffer +="^FO"+x+","+y+"^A0R,"+h+","+w+"^FD"+str+"^FS";}/*** 打印中文字符串* @param strCN* @param x 距左顶角沿X轴的距离(原点)单位:dots* @param y 距左顶角沿Y轴的距离(原点)单位:dots* @param h 英文字符,数字字体高度* @param w 英文字符,数字字体宽度* @param b 图片放大系数接受的值:1 至10 默认值:1 (在这里即就是中文显示的大小)*^XG 调用图象格式^XGd:o.x,mx,myd---已存储图像的源设备mx = x 轴的放大系数接受的值:1 至10 默认值:1my = y 轴的放大系数接受的值:1 至10 默认值:1~DG 命令用于下载以ASCII 十六进制表示的图形图像格式~DGd:o.x,t,w,datad = 存储图像的设备t = 图形中的总字节数w = 每行的字节data = 定义图像的ASCII 十六进制字符串一个汉字或符号在字库中的顺序号=94*(区码-1)+(位码-1)机内码与区位码之间的变换关系:机内码高位字节=区码+160机内码低位字节=位码+160一个汉字字模在24点阵字库中的起始位置=72×[(机内码高字节-176)×94 + (机内码低字节-161)] 汉字点阵数据存储位置偏移量offset =(94×(区码-1)+(位码-1))×72*/public void printCN(String strCN, int x, int y,int h,int w,int b) {System.out.println(strCN);byte[] ch = str2bytes(strCN);for (int off = 0; off < ch.length;) {if (((int) ch[off] & 0x00ff) >= 0xA0) {//ASCII码值"0xa0"表示汉字的开始int qcode = ch[off] & 0xff;int wcode = ch[off + 1] & 0xff;s_prt_buffer = s_prt_buffer+String.format("^FO%d,%d^XG0000%01X%01X,%d,%d^FS\n", x,y, qcode, wcode,b,b);s_prt += String.format("~DG0000%02X%02X,00072,003,\n", qcode, wcode);qcode = (qcode + 128 - 32) & 0x00ff;//区码:或qcode = (qcode - 128 - 32) & 0x00ff;(一般这样用)可达到减去0xA0的效果wcode = (wcode + 128 - 32) & 0x00ff;//位码:或wcode = (wcode - 128 - 32) & 0x00ff;(一般这样用)可达到减去0xA0的效果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;s_prt += String.format("%02X%02X%02X\n", qcode, wcode,qcode1); //%02X --- 以十六进制显示,不足两位则补零}x = x + 25*b;off = off + 2;//中文包含两个字节} else if (((int) ch[off] & 0x00FF) < 0xA0) {printChar(String.format("%c",ch[off]), x, y, h, w);x = x + 15;off++;//英文包含一个字节}}}byte[] str2bytes(String s) {if (null == s || "".equals(s)) {return null;}byte[] abytes = null;try {abytes = s.getBytes("gb2312");} catch (UnsupportedEncodingException ex) {}return abytes;}}(2)上面的s24.lib包(24*24点阵字体库)需要添加-----放在项目下(需要注意路径问题)(3)下面的ZPL函数能够在6.5*1.3cm的纸张下打印出条形码长度与注释长度等宽条形码和注释等宽:VIN码长度为17位^XA,^MD16^FO100,40^A5N,30,33^BY4,3,150^BCN,,Y,N^FDLNBMDLAA1CR0238 37^XZ(4)不设置注释的字体和大小,可以居中打印出来,下面是具体的打印命令:^XA,^MD16^FWN,2^FO100,40^BY2,3,100^BCN,,Y,N,N^FDLNBMDLAA8CU000245 ^FS^XZSue remarks:在调整条形码和注释等宽的时候,当字体类型和大小很难调整,达到要求时,可以考虑调整宽条与窄条的比例。