斑马打印机 ZPL打印
先上图
再上代码
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打印相关推荐
- ZPL指令打印 斑马打印机指令打印
首先ZPL(Zebra Programming language)是斑马家搞的ZPL语言,用于和打印机通讯打印开发的指令.然后理解了这个只是个指令的东西后,我们接着就想想怎么弄,本着怎么简单怎么来的原 ...
- 基于C#在WPF中使用斑马打印机进行打印
最近在项目中接手了一个比较有挑战性的模块--用斑马打印机将需要打印的内容打印出来.苦苦折腾了两天,总算有所收获,就发到网上来骗骗分数-_-|| 项目中使用的打印机型号为GX430t的打印机,接手的时候 ...
- 基于C#在WPF中使用斑马打印机进行打印【转】
原文链接:http://ju.outofmemory.cn/entry/132476 最近在项目中接手了一个比较有挑战性的模块--用斑马打印机将需要打印的内容打印出来.苦苦折腾了两天,总算有所收获,就 ...
- Zebra 斑马打印机如何打印中文参数
要实现ZPL打印中文,首先需要zebra打印机加载SIMSUN.TTF(宋体),然后在ZPL中编码使用UTF-8的encoding来打印,类似如下: ^XA #标签的开始 ^CW1,E:SIMSUN. ...
- 斑马打印机怎么打印二维码_简单介绍斑马打印机---GX430t
斑马条码打印机GX430t产品特点: 1.斑马高清打印头,打印更清晰 2.自动测纸,告别繁琐测纸步骤 3.防静电刷,有效保护打印头 4.外观大方,操作便捷易用 5.可移动式感应器,适用不同形状标签 6 ...
- [条码打印]使用斑马语言(ZPL)打印汉字
默认情况下条码打印机是不能打印汉字的, 不过条码打印机是支持上传自定义字体的, 但是这个字体库跟windows里面的字体库肯定不是一回事, 起初我觉得最好能通过上传字体来实现打印汉字, 但是大概研究了 ...
- 斑马打印机-中文打印
中文打印 通常有两种方式 1.使用字体库,代价高,使用简单速度快 2.通过图片方式打印,免费使用,速度适中 官方有下载Fnthex32.dll https://download.csdn.n ...
- 斑马打印机(zebraZT410R-203dpi)打印RFID标签流程
1.首先连接到打印机 下面代码为连接打印机的代码,其中ip为打印机ip地址, "TcpConnection.DEFAULT_CPCL_TCP_PORT"的值为6101. publi ...
- 斑马打印机怎么打印二维码_万能打印机厂家是怎么改良打印机的?
一个好的万能打印机厂家是不断优化自己的产品,生产出性价比更高的UV平板打印机,本文就说说万能打印机厂家是怎么改良打印机的? 一.万能打印机厂家是怎么改良打印机的? 1.改良万能打印机精度 改装精度有两 ...
- 发送ZPL指令到斑马打印机,并监控打印成功或者失败的状态信息
Visual C# 入门 本文共分为两个部分: 第一部分:介绍如何与Zebar进行连接,把ZPL指令或者模板文件发送到斑马打印机进行打印. 第二部分:介绍如何接收Zebar进行打印之后如何得到斑马打印 ...
最新文章
- Hyper-v Server在线调整虚拟硬盘大小
- haproxy调度web案例
- 线上操作与线上问题排查实战
- 如果用户计算机已经与网络物理相连,计算机考试卷
- mybatis 默认参数名#{0}、#{arg0}、#{param1},以及@Param
- 基于Matlab的跨孔CT胖射线追踪算法(二)
- Android UI 调试常用工具(Dump view UI hierarchy for Automator)
- 电销机器人源码支持私有云和本地部署
- 基于PHP的超市库存管理系统
- 深度步态识别综述(二)
- 51个 Scratch 趣味小游戏(源码)
- python3.6 添加tab键功能
- 解决在MyEclipse中,process报launching client等待的问题
- jq获取span标签的赋值和取值
- 【CS231n】十五、深度学习的高效算法和硬件设计
- Linux发行商,能否齐步走?
- MATLAB 太阳系九大行星运行(天文物理)天体仿真(一)
- 怎么为图片、视频设置打开方式
- jquery学习笔记及常用函数封装
- 支付宝小程序唤起独立签约
热门文章
- 《深入理解计算机系统》第七章学习笔记
- win10显示WiFi已连接但无法访问互联网?
- TensorFlow1.x入门(2)——变量的定义及其操作
- OpenWRT配置 -- 网络配置network文件
- 好看的typecho心情说说主题模板 记录生活日记
- NFT Insider #58:麦当娜和 Beeple 推出 NFT,YGG 与 Magic Eden 达成合作
- vue实现中英文切换
- c语言十进制转二进制过程,C语言十进制转二进制代码实例
- 教你轻松获取windows10锁屏壁纸
- Android dialog弹出报错Alert Dialog Unable to add window android.view.ViewRootImpl$W. permission denied