参考文章:https://blog.csdn.net/scholar_man/article/details/78784163

打印机使用的是斑马打印机
条码样式

工具类ZplPrinter

import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;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;/*** @description: 条形码工具类* @author: haoxueyang* @create: 2021-05-17 16:13*/
@Configuration //使用@Configuration是为了setEnvironment环境变量的注入
public class ZplPrinter implements EnvironmentAware {private String printerModelNumber = null;//打印机型号private PrintService printService = null;//打印机服务private byte[] dotFont;private String begin = "^XA";    //标签格式以^XA开始private String end = "^XZ";        //标签格式以^XZ结束private String content = "";/*** tr接口发送给SAP数据所调用的SAP的接口地址*/private static String ZPL_PRINTER_FONT_FILE;@Overridepublic void setEnvironment(Environment environment) {this.ZPL_PRINTER_FONT_FILE = environment.getProperty("zpl.printer.file");}public ZplPrinter() {}/*** 构造方法** @param printerModelNumber 打印机型号*/public ZplPrinter(String printerModelNumber) {this.printerModelNumber = printerModelNumber;//加载字体File file = new File(this.ZPL_PRINTER_FONT_FILE);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文件不存在");}//初始化打印机PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();System.out.println("默认的打印机" + defaultService.getName());if (services != null && services.length > 0) {for (PrintService service : services) {if (printerModelNumber.equals(service.getName())) {printService = service;break;}}}if (printService == null) {System.out.println("没有找到打印机:[" + printerModelNumber + "]");//循环出所有的打印机if (services != null && services.length > 0) {System.out.println("可用的打印机列表:");for (PrintService service : services) {System.out.println("[" + service.getName() + "]");}}} else {System.out.println("找到打印机:[" + printerModelNumber + "]");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) {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   高度* @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";}public void setLineChar(String str, int x, int y, int h, int w) {content += "^FO" + x + "," + y + "^AF0," + h + "," + w + "^FD" + str + "^FS";}public void setColumnChar(String str, int x, int y, int h, int w) {content += "^FO" + x + "," + y + "^AFR," + 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 void print(String zpl) {if (printService == null) {System.out.println("打印出错:没有找到打印机:[" + printerModelNumber + "]");throw new BizException("打印出错:没有找到打印机:[" + printerModelNumber + "]");}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);System.out.println("已打印");} catch (PrintException e) {e.printStackTrace();}}/*** 字符串转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;}
}

ServiceImpl层

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import javax.print.*;
import java.text.SimpleDateFormat;@Service
public class IBaseDeviceServiceImpl extends ServiceImpl<BaseDeviceMapper, BaseDevice> implements IBaseDeviceService {@AutowiredIBaseDeviceService service;@AutowiredIHrUserService userService;@AutowiredLogisticsOperatorServiceImpl logisticsOperatorService;@AutowiredLogisticsPathPointServiceImpl logisticsPathPointService;@AutowiredIBaseDeviceRelationService iBaseDeviceRelationService;@AutowiredIWmInventoryService inventoryService;@AutowiredIWmWarehouseService warehouseService;@AutowiredIBaseLabelCodeConvertService labelCodeConvertService;/*** pda端打印机打印标签* 1、需要把C://ts24.lib文件放到指定位置** @param wrapper*/@Overridepublic void printPdaLabelCodeByPrinter(WmInventoryWrapper wrapper) throws PrintException {//条码显示的数据WmInventory inventory = inventoryService.getOne(new QueryWrapper<WmInventory>().eq("label_code", wrapper.getLabelCode()).last("limit 1"));if (inventory != null) {if (inventory.getAssociateWarehouseId() != null) {WmWarehouse warehouse = warehouseService.getOneById(inventory.getAssociateWarehouseId());if (warehouse != null) {wrapper.setWarehouseCode(warehouse.getCode());//仓库codewrapper.setWarehouseName(warehouse.getName());//仓库name}}if (inventory.getMaterialId() != null) {MaterialMapCache materialCache = MaterialMapCache.getInstance();BaseMaterial material = materialCache.getIdKeyMap().get(inventory.getMaterialId());if (material != null) {wrapper.setMaterialCode(material.getCode());//物料codewrapper.setMaterialName(material.getName());//物料名称}}} else {throw new BizException(wrapper.getLabelCode() + "标签不存在");}wrapper.setMaterialQuantity(inventory.getMaterialQuantity());//数量if (inventory.getPackageType() != null) {if (inventory.getPackageType() == Constant.PackageType.PACKAGE_TYPE_1) {wrapper.setBoxType("整箱区满箱");} else if (inventory.getPackageType() == Constant.PackageType.PACKAGE_TYPE_2) {wrapper.setBoxType("整箱区不满箱");} else if (inventory.getPackageType() == Constant.PackageType.PACKAGE_TYPE_3) {wrapper.setBoxType("散装区");}}if (inventory.getCreateTime() != null) {wrapper.setCreateTime(inventory.getCreateTime());}BaseLabelCodeConvert labelCodeConvert = labelCodeConvertService.getOne(new QueryWrapper<BaseLabelCodeConvert>().eq("label_code", wrapper.getLabelCode()));if (labelCodeConvert == null) {throw new BizException("该标签["+wrapper.getLabelCode()+"]没有转换打印id");}wrapper.setLabelCode(labelCodeConvert.getId().toString());//打印this.printLabelCodeByPrinter(wrapper);}/*** 公用方法:PC端和pda端公用打印方法** @param wrapper* @throws PrintException*/private void printLabelCodeByPrinter(WmInventoryWrapper wrapper) throws PrintException {//条码设置ZplPrinter zplPrinter = new ZplPrinter(wrapper.getPrintDeviceModelNumber());//第一行zplPrinter.setText("物料名称", 30, 60, 19, 19, 14, 1, 1, 22);//1.1if (!StringUtils.isEmpty(wrapper.getMaterialName())) {zplPrinter.setText(wrapper.getMaterialName(), 130, 60, 19, 19, 14, 1, 1, 22);//1.2}//第二行zplPrinter.setText("物料编码", 30, 110, 18, 18, 13, 1, 1, 22);//2.1if (!StringUtils.isEmpty(wrapper.getMaterialCode())) {zplPrinter.setText(wrapper.getMaterialCode(), 130, 110, 18, 18, 13, 1, 1, 22);//2.2}//第三行zplPrinter.setText("箱内数量", 30, 160, 18, 18, 13, 1, 1, 22);//3.1zplPrinter.setText(wrapper.getMaterialQuantity().toString(), 130, 165, 18, 18, 13, 1, 1, 22);//3.2zplPrinter.setText("箱子类型", 300, 160, 18, 18, 13, 1, 1, 22);//3.3zplPrinter.setText(wrapper.getBoxType(), 400, 160, 18, 18, 13, 1, 1, 22);//3.4//第四行 库存产生时间zplPrinter.setText("库存产生时间", 120, 210, 18, 18, 15, 1, 1, 22);if (wrapper.getCreateTime() != null) {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd");zplPrinter.setText(simpleDateFormat.format(wrapper.getCreateTime()), 320, 215, 18, 18, 13, 1, 1, 22);}//表格线//行线zplPrinter.setLineChar("____", 30, 20, 2, 100); //第1条横线zplPrinter.setLineChar("____", 60, 20, 2, 110); //第1条横线zplPrinter.setLineChar("____", 30, 80, 2, 100); //第2条横线zplPrinter.setLineChar("____", 60, 80, 2, 110); //第2条横线zplPrinter.setLineChar("____", 30, 130, 2, 100); //第3条横线zplPrinter.setLineChar("____", 60, 130, 2, 110); //第3条横线zplPrinter.setLineChar("____", 30, 180, 2, 100); //第4条横线zplPrinter.setLineChar("____", 60, 180, 2, 110); //第4条横线zplPrinter.setLineChar("____", 30, 225, 2, 100); //第5条横线 即条形码上方横线zplPrinter.setLineChar("____", 60, 225, 2, 110); //第5条横线 即条形码上方横线zplPrinter.setLineChar("____", 30, 350, 2, 100); //第6条横线 即条形码下方横线zplPrinter.setLineChar("____", 60, 350, 2, 110); //第6条横线 即条形码下方横线//列线zplPrinter.setColumnChar("____", 20, 40, 2, 60);//第1列竖线zplPrinter.setColumnChar("____", 20, 60, 2, 60);//第1列竖线zplPrinter.setColumnChar("_____", 120, 41, 2, 30);//第2列竖线zplPrinter.setColumnChar("____", 120, 62, 2, 20);//第2列竖线zplPrinter.setColumnChar("___", 290, 151, 1, 1);//第3列竖线 平均分列线zplPrinter.setColumnChar("__", 290, 164, 1, 1);//第3列竖线 平均分列线zplPrinter.setColumnChar("___", 390, 151, 1, 1);//第4列竖线zplPrinter.setColumnChar("__", 390, 164, 1, 1);//第4列竖线zplPrinter.setColumnChar("____", 550, 40, 2, 60);//第5列竖线zplPrinter.setColumnChar("____", 550, 60, 2, 60);//第5列竖线String barZpl = "^FO35,260^BY2,3.0,80^BCN,,Y,N,N^FD${data}^FS";//条码样式模板zplPrinter.setBarcode(wrapper.getLabelCode(), barZpl);//打印机打印条码String printerZpl = zplPrinter.getZpl();zplPrinter.print(printerZpl);}}

service层

public interface IBaseDeviceService extends IService<BaseDevice> {/*** pda端:打印机打印标签** @param wrapper*/void printPdaLabelCodeByPrinter(WmInventoryWrapper wrapper) throws PrintException;}

controller层


@Controller
@RequestMapping("/sys/baseDevice")
public class BaseDeviceController {@AutowiredIBaseDeviceService service;private static final Logger logger = LoggerFactory.getLogger(BaseDeviceController.class);/*** pda端:打印机打印标签** @return*/@RequestMapping("/printLabelCodeByPrinter")@ResponseBodypublic JsonResult printLabelCodeByPrinter(@RequestBody WmInventoryWrapper wrapper) {JsonResult jsonResult = new JsonResult();try {if (StringUtils.isEmpty(wrapper.getLabelCode())) {return jsonResult.setMsg(Constant.Info.PARAM_ERR);}service.printPdaLabelCodeByPrinter(wrapper);return jsonResult.setMsg("打印成功").setSuccess(true);} catch (BizException | PrintException e) {logger.error("接口报错【/getPage】", e);jsonResult.setMsg(e.getMessage());jsonResult.setSuccess(false);}return jsonResult;}}

java使用zpl指令在Zebra打印机上打印条形码相关推荐

  1. 通过ZPL指令调用zebra打印机打印面单(java版)

    1.获取打印机的IP及端口(端口默认为9100): 2.通过RabbitMQ发送监听调用打印方法: 3.查询数据库中打印机是否存在,并获取打印机IP及端口: 4.查询要打印的订单信息及明细: 5.打印 ...

  2. Excel表预览居中,但打印无法居中,同一文件在别的用户上在同一台打印机上打印居中...

    本文出自Simmy的个人blog:西米在线 http://simmyonline.com/archives/41.html 原先打印机通过打印服务器上共享方式双击安装,现改用直连方式,安装驱动后问题解 ...

  3. [C#] ZEBRA ZPL指令打印BarCode,QRCode

    公司业务需要 接触到c#的打印机方面的业务.要求客户端控制打印机来打印条码,二维码. 条码:在条码打印上 在传参方面和排版方面需要去慢慢调试. 二维码:直接指令打印二维码在控制二维码大小很难把控,因为 ...

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

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

  5. Java对接Zebra斑马打印机打印条形码相关

    最近在公司里面做了个业务,主要是对接工业打印机打印条形码,然后在CSDN和稀土掘金看了一下其他的方案很久嘛,然后自己又总结了一些,加入了进来,方法可能有点low,大家有更好的方案推荐,可以评论区cal ...

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

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

  7. java调用zebra_java调用斑马GK888t打印机(ZPL指令)

    在项目中使用斑马打印机遇到了如下问题: 在实际打印信息前,需要修改打印机驱动设置,主要是设置打印颜色深度,默认值一般会打印的比较浅.通常情况下,在设置的颜色深度后,打印机能够很好的工作.但是如果我将程 ...

  8. C#发送ZPL控制斑马Zebra打印机源码

    1.最近想把斑马打印机集成到自己的C#程序里,找了好多资料,最后采用通过发送ZPL语言给打印机来完成打印这种方式,该程序可以创建.保存.调用ZPL模板,可以修改打印条码的参数并保存到模板里. 2.下面 ...

  9. 调用SMT.ZEBRA.dll斑马打印机库文件,打印条形码。

    调用SMT.ZEBRA.dll斑马打印机库文件,打印条形码. 效果图: 准备:1. 斑马打印机 型号GT820. 2. 斑马打印机驱动. 3. 库文件SMT.ZEBRA.dll 和 SMT.ZEBRA ...

  10. java 打印机类printer_GitHub - 505058216/thermal_printer: Java实现网络小票打印机自定义无驱打印...

    Java实现POS打印机自定义无驱打印 热敏打印机使用越来越广泛,而安装驱动相当复杂,万幸的是,几乎所有的热敏打印机都支持ESC/P指令,参考网络上一些资料后,在此整理了一份自定义打印的方案 • 打印 ...

最新文章

  1. python字符照片_python图片转字符图片
  2. python【蓝桥杯vip练习题库】BASIC-10十进制转十六进制
  3. 解決yum [Errno -1] Metadata file does not match checksum
  4. Linux中fork函数的作用及用法
  5. 归并排序比较次数_归并排序「从入门到放弃」
  6. linux字符驱动之点亮LED
  7. swagger2如何测试单个文件或者多文件上传
  8. github 部署mysql_GitHub - luckman666/deploy_mysql_cluster: 一键部署mysql集群
  9. 力扣645.错误的集合
  10. python3网络编程传输图片_python实现同一局域网下传输图片
  11. 只有20行Javascript代码!手把手教你写一个页面模板引擎
  12. Javaweb免费RDP报表工具常用函数的用法总结
  13. P卡、worldfirst、连连跨境电商收款哪家好?
  14. 【学习资源】光学、物理类、电子学实验合集
  15. 网易云音乐的歌词无法在桌面歌词显示
  16. 安卓APP开发发展趋势与前景
  17. 飞秋弹r6002 floating point not loaded关闭后退出
  18. 异常:javax.el.PropertyNotFoundException: Property ‘id‘ not found on ..........
  19. Linux新特性之btrfs文件系统
  20. Tomcat 8(六)catalina.bat详解

热门文章

  1. 微pe不识别nvme固态硬盘_WinPE无法识别NVMe SSD硬盘,如何重装系统
  2. git放弃本地修改:
  3. 2020年度十大高薪岗位出炉,程序员霸榜!
  4. 数字逻辑课程设计--数字钟的设计(quartus ii)(内附源代码和实习报告以及6篇实习日志)
  5. JS验证邮箱格式、信用码、税号和注册号
  6. 注册Gmail账号手机号码提示无法验证
  7. html背景图片在文字下面,背景图片加文字的HTML怎么写
  8. JAVA里面一加到一百等于多少_从1加到100等于多少 【求和算法汇总】
  9. 华为篇-嵌入式公司待遇盘点-第二期
  10. 手机wap浏览器的设计