先上图

再上代码

package com.framework.utils;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;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;
import javax.print.attribute.standard.PrinterName;import com.framework.entity.SysPlanBetEntity;/*** 高线挂牌机器人打印使用* 2022.3.3* @author lrd**/
public class ZplPrinterRobot {private String printerURI = null;//打印机完整路径private PrintService printService = null;//打印机服务private byte[] dotFont;private String begin = "^XA";   //标签格式以^XA开始private String end = "^XZ";      //标签格式以^XZ结束private String content = "";/*** 中文字符、英文字符(包含数字)混合 转90度*/public void setDpi() {//content += "^JMA";content +="^LH0,0";}public static void main(String[] args) {//加载字体File file = new File("D://ts24.lib");if(file.exists()){FileInputStream fis;try {fis = new FileInputStream(file);byte[] dotFont = new byte[fis.available()];fis.read(dotFont);fis.close();} catch (IOException e) {e.printStackTrace();}}else{System.out.println("D://ts24.lib文件不存在");throw new RRException("D://ts24.lib文件不存在");}//初始化打印机PrintService[] services = PrintServiceLookup.lookupPrintServices(null,null);System.out.println(Arrays.toString(services));String printName = "ZT510-300dpi ZPL";ZplPrinterRobot p = new ZplPrinterRobot(printName);//p.setDpi();SysPlanBetEntity planBet = new SysPlanBetEntity();planBet.setTargetName("钢筋混凝土用热轧带肋钢筋");planBet.setMark("HRB400E");planBet.setNorms("Φ10");planBet.setMark("HRB400E");planBet.setMatNo("123456789012");planBet.setLicNo("XK05-001-00727");planBet.setExeSta("GB/T1499.2-2018");planBet.setTaskId("D1740001");planBet.setMatPraWei(new BigDecimal(12300));planBet.setClassCode("甲jia");String targetName = planBet.getTargetName();if(targetName.length()>6){String targetName1=targetName.substring(0,6);p.setTextR(targetName1, 120, 250, 35, 30); String targetName2=targetName.substring(6);p.setTextR(targetName2, 155, 250, 35, 30); }else{p.setTextR(planBet.getTargetName(), 130, 250, 40, 40);           //产品名称:钢筋混凝土用热轧带肋钢筋(系统带出)}p.setTextR("HRB400E",215, 250, 40, 40);                 //牌    号:HRB400p.setTextR(planBet.getNorms(), 300, 250, 40, 40);                // 规    格:Φ8p.setTextR("支数1211212122", 380, 250, 40, 40);                //支数/捆号:D174000101(注:对应系统里的材料号)870
//  SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");p.setTextR("甲1211212122", 465, 250, 40, 40);                //  日期789  810p.setTextR(planBet.getLicNo(), 550, 250, 40, 40);                //  许可证号:XK05-001-00276(系统带出)--------630  600//条码    "^CWJ,E:ANMDS.TTF^FB600,1,0,L,0^LH0,0"+"^FO"+x+","+y+"^AJB,"+h+","+w+"^CI28^FD"+str+"^FS";String bar2 = "D221048003";//12位String bar2Paper = "^FO620,550^BY2,3.0,80^FB600,1,0,L,0^BCB,,Y,N,N^FD${data}^FS";//条码样式模板p.setBarcode(bar2,bar2Paper);p.setTextLT("GB1499.2-2008", 160, 340, 40, 40);               //执行标准:GB1499.2 (注:不带年份)p.setTextLT("D1740001", 240, 340, 40, 40);                // 炉 批 号:D1740001(注:对应系统里的轧制批号)p.setTextLT("/", 330, 340, 40, 40);//炉号 30p.setTextLT("2334", 410, 340, 40, 40);        //重    量:实际重量 20//二维码String bar3 ="产品名称:"+planBet.getTargetName()+" 重量:2333kg"+"规格:"+planBet.getNorms()+"牌号:"+planBet.getMark();//12位^CI26String bar3Paper ="^FO520,70^BQ,2,3^CI26^FH^FDQA,${data}^FS";    //二维码样式模板p.setBarcode(bar3,bar3Paper); String zpl = p.getZpl();System.out.println(zpl);boolean result = p.print(zpl);//打印System.out.println(result);if(!result){throw new RRException("第一次打印出错");}p.resetZpl();//注意要清除上次的打印信息
}/*** 构造方法* @param printerURI 打印机路径*/
public ZplPrinterRobot(String printerURI){this.printerURI = "ZT510-300dpi ZPL";//加载字体File file = new File("D://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("D://ts24.lib文件不存在");throw new RRException("D://ts24.lib文件不存在");}//初始化打印机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()+"]");// ZDesignerif (service.getName().indexOf("ZDesigner") >= 0) {ZplPrinterRobot p = new ZplPrinterRobot(service.getName());}}}throw new RRException("没有找到打印机:["+printerURI+"]");}else{System.out.println("找到打印机:["+printerURI+"]");System.out.println("打印机名称:["+printService.getAttribute(PrinterName.class).getValue()+"]");}}public static void cancelPrint(String printer) {ZplPrinterRobot p = new ZplPrinterRobot(printer);p.cancel();String zpl = p.getZpl();p.print(zpl);p.print(zpl);p.print(zpl);p.print(zpl);p.print(zpl);p.print(zpl);p.print(zpl);p.print(zpl);p.print(zpl);p.print(zpl);System.out.println("取消成功");}private void cancel() {// TODO Auto-generated method stubbegin = "";end = "";content = "~JA";}/*** 打印标签 */public static void printTag(String printer,List<SysPlanBetEntity> planBets,Integer tag) {ZplPrinterRobot p = new ZplPrinterRobot(printer);switch(tag){case 1:System.out.println("1.方牌高线厂");for(SysPlanBetEntity planBet:planBets){System.out.println(1);if(planBet.getTargetName()==null || "".equals(planBet.getTargetName())){throw new RRException("产品名称不能为空");}if(planBet.getMark()==null || "".equals(planBet.getMark())){throw new RRException("牌号不能为空");}if(planBet.getNorms()==null || "".equals(planBet.getNorms())){throw new RRException("规格不能为空");}if(planBet.getMatNo()==null || "".equals(planBet.getMatNo())){throw new RRException("材料号不能为空");}if(planBet.getProdDate()==null || "".equals(planBet.getProdDate())){throw new RRException("生产日期不能为空");}if(planBet.getLicNo()==null ||"".equals(planBet.getLicNo())){throw new RRException("许可证号不能为空");}if(planBet.getExeSta()==null ||"".equals(planBet.getExeSta())){throw new RRException("执行标准不能为空");}if(planBet.getTaskId()==null || "".equals(planBet.getTaskId())){throw new RRException("轧制批号不能为空");}if(planBet.getMatPraWei()==null||"".equals(planBet.getMatPraWei())){throw new RRException(planBet.getMatNo()+"实重不能为空");}if(planBet.getClassCode()==null ||"".equals(planBet.getClassCode())){throw new RRException("生产班组不能为空");}Integer MatPraWei = planBet.getMatPraWei().setScale(0, BigDecimal.ROUND_HALF_UP).intValue();System.out.println("不保留小数"+MatPraWei);String targetName = planBet.getTargetName();if(targetName.length()>6){String targetName1=targetName.substring(0,6);p.setTextR(targetName1, 385, 240, 25, 25); String targetName2=targetName.substring(6);p.setTextR(targetName2, 360, 240, 25, 25); }else{p.setTextR(planBet.getTargetName(), 370, 240, 25, 25);           //产品名称:混凝土用热轧带肋钢筋(系统带出)}                                 //参数1 :从上到下  y   参数2:从左到右  x    参数3:字体宽      参数4:字体高       p.setTextR(planBet.getMark(),310, 240, 30, 30);                 //牌    号:HRB400p.setTextR(planBet.getNorms(), 255, 240, 30, 30);                // 规    格:Φ8p.setTextR(planBet.getMatNo(), 200, 240, 30, 30);                //支数/捆号:D174000101(注:对应系统里的材料号)SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");p.setTextR(sdf.format(planBet.getProdDate()), 145, 240, 30, 30);  //生产日期:2017-04-08p.setTextR(planBet.getLicNo(), 90, 240, 30, 30);                //  许可证号:XK05-001-00276(系统带出)p.setTextR(planBet.getExeSta(), 370, 590, 30, 30);               //执行标准:GB1499.2 (注:不带年份)p.setTextR(planBet.getTaskId(), 300, 590, 30, 30);                 // 炉 批 号:D1740001(注:对应系统里的轧制批号)if("1".equals( planBet.getBuilding() )){//building 字段为1  炉号打印/planBet.setStoNo("/");}p.setTextR(planBet.getStoNo(), 255, 590, 30, 30);//炉号p.setTextR(Integer.toString(MatPraWei), 255, 590, 30, 30);        //重    量:实际重量p.setTextR(planBet.getClassCode()+" "+planBet.getClassCode2(),  200,590, 30, 30);            // 生产班组:甲(注:填写 甲 乙 丙)//条码String bar2 = planBet.getMatNo();//12位String bar2Paper = "^FO23,200^BY2,3.0,50^BCR,,Y,N,N^FD${data}^FS";//条码样式模板p.setBarcode(bar2,bar2Paper);//二维码String bar3 ="产品名称:"+planBet.getTargetName()+" 重量:"+Double.toString(MatPraWei)+"kg"+"规格:"+planBet.getNorms()+"牌号:"+planBet.getMark();//12位^CI26String bar3Paper ="^FO18,558^BQ,2,3^CI26^FH^FDQA,${data}^FS";    //二维码样式模板p.setBarcode(bar3,bar3Paper);       String zpl = p.getZpl();System.out.println(zpl);boolean result = p.print(zpl);//打印if(!result){throw new RRException("第一次打印出错");}result = p.print(zpl);//打印if(!result){throw new RRException("第二次打印出错");}p.resetZpl();//注意要清除上次的打印信息}break;}}/*** 设置条形码* @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) {//              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;
//          } 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 字体高度height* @param w 字体宽度width*/public void setText(String str, int x, int y , int h, int w) {content += "^CWJ,E:ANMDS.TTF^LH0,0"+"^FO"+x+","+y+"^AJN,"+h+","+w+"^CI28^FD"+str+"^FS";}/*** 中文字符、英文字符(包含数字)混合 转180度* ^AJB:旋转180°* ^FO:往左上角打印* @param str 中文、英文* @param x x坐标* @param y y坐标* @param h 字体高度height* @param w 字体宽度width*/public void setTextR(String str, int x, int y , int h, int w) {content += "^CWJ,E:ANMDS.TTF^FB600,1,0,L,0^LH0,0"+"^FO"+x+","+y+"^AJB,"+h+","+w+"^CI28^FD"+str+"^FS";}/*** 中文字符、英文字符(包含数字) 往左下角打印* "^FT:往左下角打印* @param str 中文、英文* @param x x坐标* @param y y坐标* @param h 字体高度height* @param w 字体宽度width*/public void setTextLT(String str, int x, int y , int h, int w) {content += "^CWJ,E:ANMDS.TTF^FB600,1,0,L,0^LH0,0"+"^FT"+x+","+y+"^AJB,"+h+","+w+"^CI28^FD"+str+"^FS";}/*** 英文字符串(包含数字)* @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";}/*** 英文字符(包含数字)顺时针旋转90度* @param str 英文字符串* @param x x坐标* @param y y坐标* @param h 高度* @param w 宽度*/public void setCharR(String str, int x, int y, int h, int w) {content += "^FO" + x + "," + y + "^A0R," + h + "," + w + "^FD" + str + "^FS";}/*** 获取完整的ZPL* @return*/public String getZpl() {return begin + content + end;}/*** 重置ZPL指令,当需要打印多张纸的时候需要调用。*/public void resetZpl() {begin = "^XA";end = "^XZ";content = "";}/*** 打印* @param zpl 完整的ZPL*/public boolean print(String zpl){if(printService==null){System.out.println("打印出错:没有找到打印机:["+printerURI+"]");return false;}DocPrintJob job = printService.createPrintJob();//byte[] by = zpl.getBytes();byte[] by=str2bytes(zpl);//要转为utf-8DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;Doc doc = new SimpleDoc(by, flavor, null);try {job.print(doc, null);System.out.println("已打印");return true;} catch (PrintException e) {e.printStackTrace();return false;}}/*** 字符串转byte[]* @param s* @return*/private byte[] str2bytes(String s) {if (null == s || "".equals(s)) {return null;}byte[] abytes = null;try {abytes = s.getBytes("utf-8");} catch (UnsupportedEncodingException ex) {ex.printStackTrace();}return abytes;}
}

ZPL 常用指令

指令 示意
^XA 开始指令
^LH0,0 标签起始坐标
^FO60,20 设置字体开始位置
^ADN,36,20 字体大小
^FD 123456 ^FS 打印123456 FD(开始)FS(结束)
^FO60,95 设置二维码的开始位置
^B7N,5,3,N 二维码设置
^FD 123456 ^FS 设置二维码的内容
^XZ 结束指令

具体指令可参考

https://wenku.baidu.com/view/d3035d96ad51f01dc281f1b0.html
https://www.cnblogs.com/hikarusun/archive/2012/08/10/2631707.html

斑马打印机 ZPL打印相关推荐

  1. ZPL指令打印 斑马打印机指令打印

    首先ZPL(Zebra Programming language)是斑马家搞的ZPL语言,用于和打印机通讯打印开发的指令.然后理解了这个只是个指令的东西后,我们接着就想想怎么弄,本着怎么简单怎么来的原 ...

  2. 基于C#在WPF中使用斑马打印机进行打印

    最近在项目中接手了一个比较有挑战性的模块--用斑马打印机将需要打印的内容打印出来.苦苦折腾了两天,总算有所收获,就发到网上来骗骗分数-_-|| 项目中使用的打印机型号为GX430t的打印机,接手的时候 ...

  3. 基于C#在WPF中使用斑马打印机进行打印【转】

    原文链接:http://ju.outofmemory.cn/entry/132476 最近在项目中接手了一个比较有挑战性的模块--用斑马打印机将需要打印的内容打印出来.苦苦折腾了两天,总算有所收获,就 ...

  4. Zebra 斑马打印机如何打印中文参数

    要实现ZPL打印中文,首先需要zebra打印机加载SIMSUN.TTF(宋体),然后在ZPL中编码使用UTF-8的encoding来打印,类似如下: ^XA #标签的开始 ^CW1,E:SIMSUN. ...

  5. 斑马打印机怎么打印二维码_简单介绍斑马打印机---GX430t

    斑马条码打印机GX430t产品特点: 1.斑马高清打印头,打印更清晰 2.自动测纸,告别繁琐测纸步骤 3.防静电刷,有效保护打印头 4.外观大方,操作便捷易用 5.可移动式感应器,适用不同形状标签 6 ...

  6. [条码打印]使用斑马语言(ZPL)打印汉字

    默认情况下条码打印机是不能打印汉字的, 不过条码打印机是支持上传自定义字体的, 但是这个字体库跟windows里面的字体库肯定不是一回事, 起初我觉得最好能通过上传字体来实现打印汉字, 但是大概研究了 ...

  7. 斑马打印机-中文打印

    中文打印 通常有两种方式  1.使用字体库,代价高,使用简单速度快  2.通过图片方式打印,免费使用,速度适中 官方有下载Fnthex32.dll    https://download.csdn.n ...

  8. 斑马打印机(zebraZT410R-203dpi)打印RFID标签流程

    1.首先连接到打印机 下面代码为连接打印机的代码,其中ip为打印机ip地址, "TcpConnection.DEFAULT_CPCL_TCP_PORT"的值为6101. publi ...

  9. 斑马打印机怎么打印二维码_万能打印机厂家是怎么改良打印机的?

    一个好的万能打印机厂家是不断优化自己的产品,生产出性价比更高的UV平板打印机,本文就说说万能打印机厂家是怎么改良打印机的? 一.万能打印机厂家是怎么改良打印机的? 1.改良万能打印机精度 改装精度有两 ...

  10. 发送ZPL指令到斑马打印机,并监控打印成功或者失败的状态信息

    Visual C# 入门 本文共分为两个部分: 第一部分:介绍如何与Zebar进行连接,把ZPL指令或者模板文件发送到斑马打印机进行打印. 第二部分:介绍如何接收Zebar进行打印之后如何得到斑马打印 ...

最新文章

  1. Hyper-v Server在线调整虚拟硬盘大小
  2. haproxy调度web案例
  3. 线上操作与线上问题排查实战
  4. 如果用户计算机已经与网络物理相连,计算机考试卷
  5. mybatis 默认参数名#{0}、#{arg0}、#{param1},以及@Param
  6. 基于Matlab的跨孔CT胖射线追踪算法(二)
  7. Android UI 调试常用工具(Dump view UI hierarchy for Automator)
  8. 电销机器人源码支持私有云和本地部署
  9. 基于PHP的超市库存管理系统
  10. 深度步态识别综述(二)
  11. 51个 Scratch 趣味小游戏(源码)
  12. python3.6 添加tab键功能
  13. 解决在MyEclipse中,process报launching client等待的问题
  14. jq获取span标签的赋值和取值
  15. 【CS231n】十五、深度学习的高效算法和硬件设计
  16. Linux发行商,能否齐步走?
  17. MATLAB 太阳系九大行星运行(天文物理)天体仿真(一)
  18. 怎么为图片、视频设置打开方式
  19. jquery学习笔记及常用函数封装
  20. 支付宝小程序唤起独立签约

热门文章

  1. 《深入理解计算机系统》第七章学习笔记
  2. win10显示WiFi已连接但无法访问互联网?
  3. TensorFlow1.x入门(2)——变量的定义及其操作
  4. OpenWRT配置 -- 网络配置network文件
  5. 好看的typecho心情说说主题模板 记录生活日记
  6. NFT Insider #58:麦当娜和 Beeple 推出 NFT,YGG 与 Magic Eden 达成合作
  7. vue实现中英文切换
  8. c语言十进制转二进制过程,C语言十进制转二进制代码实例
  9. 教你轻松获取windows10锁屏壁纸
  10. Android dialog弹出报错Alert Dialog Unable to add window android.view.ViewRootImpl$W. permission denied