Java 调用斑马打印机实现标签打印

  • 代码实现

最近的一个项目中,需要实现java调用斑马的打印机实现标签打印功能,百度了一些资源,找了不少人搞了一台快报废的斑马105SL 300DPI打印机,分分钟就搞出来了,不过要想调试成自己所需要的样式还是得花费一定的时间才能完成的。

以下是打印机来的效果:

代码实现

/*** 采用点字字库 ts24.lib* @create 2020-03-31 16:57*/
@Slf4j
public class ZplPrinter {private String printerURI = null;           //打印机完整路径private PrintService printService = null;   //打印机服务private byte[] font;private String darkness = "~SD22";          //设置色带颜色的深度 0~30private String width = "^PW1200";           //打印宽度 0~1500private String begin = "^XA" + darkness + width;    //标签格式以^XA开始private String end = "^XZ";private String content = "";                //打印内容private String message = "";                //打印的结果信息/*** 构造方法*/public ZplPrinter(String printerURI){this.printerURI = printerURI;//加载字体File file = new File("D://lib//ts24.lib");if(file.exists()){FileInputStream fis;try{fis = new FileInputStream(file);font = new byte[fis.available()];fis.read(font);fis.close();}catch(Exception e){log.info(e.getMessage());}}else{log.info("D://lib//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){log.info("没有找到打印机:["+ printerURI +"]");if(services != null && services.length > 0){log.info("可用的打印机列表:");for(PrintService service : services){log.info("["+ service.getName() +"]");}}}else{log.info("找到打印机:["+ printerURI +"]");log.info("打印机名称:["+ 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) font[j + offset] & 0x00ff;wcode = (int) font[j + offset + 1] & 0x00ff;int qcode1 = (int) font[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指令,多张标签同时打印时需要调用*/public void resetZpl(){begin = "^XA" + darkness + width;end = "^XZ";content = "";}/*** 获取完整的ZPL指令* @return*/public String getZpl(){return begin + content + end;}/*** 字符串转换为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;}/*** 打印* @param zpl 完整的ZPL*/public boolean print(String zpl){if(printService==null){log.info("打印出错:没有找到打印机["+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);log.info("已打印");return true;} catch (PrintException e) {log.info("打印出错:"+e.getMessage());e.printStackTrace();return false;}}public static void main(String[] args) {ZplPrinter printer = new ZplPrinter("Microsoft Print to PDF");
/*** 文本*/printer.setChar("SN: 9Y203CCNW9A19396", 40, 20, 30, 30);printer.setChar("MAC: 74EE2AEB1A52", 40, 70, 30, 30);printer.setChar("DID: 9FCNY21EZJ460B190916", 40, 120, 30, 30);printer.setChar("CMIIT: 2016DP9142", 40, 170, 30, 30);
//      printer.setText("生产日期:2019", 40, 220 ,30, 30, 20, 1 , 1, 22);
//      printer.setText("生产日期:", 40, 220, 56, 56, 30, 2, 2, 24);
//      printer.setChar("2019", 120, 230, 40, 40);//条码
//      String data = "9Y203CCNW9A019396";//条码内容
//      String dataZpl = "^FO260,250^BY2,11.0,10,40^BCC,80,N^FD${data}^FS";//条码样式模板
//      printer.setBarcode(data, dataZpl);//二维码
//      String ewm = "9Y203CCNW9A019396";//条码内容
//      String ewmZpl = "^FO430,50^BQ,2,6^CI26^FH^FDQA^FD${data}^FS";//条码样式模板
//      printer.setBarcode(ewm, ewmZpl);printer.resetZpl();printer.setText("批号:", 20, 550, 56, 56, 30, 2, 2, 24);printer.setChar("78787878788", 200, 560, 40, 40);
//      printer.setText("批号:", 20, 220, 56, 56, 30, 1, 1, 24);
//      printer.setChar("78787878788", 120, 230, 40, 40);//下边的条码String bar2 = "00000999990018822969";//20位String bar2Paper = "^FO260,250^BY2,3.0,66^BCN,,Y,N,N^FD${data}^FS";//条码样式模板printer.setBarcode(bar2,bar2Paper);String zpl = printer.getZpl();
//      System.out.println(zpl);printer.print(zpl);}
}

通过在网络上查找到的一些资源,实现起来难度也不是太大。

实现以上功能,需要一份点阵的字库文件,需要这份文件的可以给我留言。

调用斑马打印机实现标签打印相关推荐

  1. 【求助】关于.NET(C#)调用斑马打印机(ZDesigner GK888t (EPL))换页时退纸的问题

    有解决过类似问题的大神请留步,救救我吧. -------分割------- 最近在做一个快递标签打印系统,使用.NET(C#)调用斑马打印机[ZDesigner GK888t (EPL)]进行打印,程 ...

  2. C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)

    在批量打印商品标签时一般都要加上条码或图片,而这类应用大多是使用斑马打印机,所以我也遇到了怎么打印的问题. 一种办法是用标签设计软件做好模板,在标签设计软件中打印,这种办法不用写代码,但对我来说觉得不 ...

  3. C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)...

    在批量打印商品标签时一般都要加上条码或图片,而这类应用大多是使用斑马打印机,所以我也遇到了怎么打印的问题. 一种办法是用标签设计软件做好模板,在标签设计软件中打印,这种办法不用写代码,但对我来说觉得不 ...

  4. C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)【转】...

    原文地址:http://blog.csdn.net/ldljlq/article/details/7338772 在批量打印商品标签时一般都要加上条码或图片,而这类应用大多是使用斑马打印机,所以我也遇 ...

  5. C#调用斑马打印机打印条码标签(含源码)(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)

    在批量打印商品标签时一般都要加上条码或图片,而这类应用大多是使用斑马打印机,所以我也遇到了怎么打印的问题. 一种办法是用标签设计软件做好模板,在标签设计软件中打印,这种办法不用写代码,但对我来说觉得不 ...

  6. 浅谈Zebra斑马打印机三种打印方式的利弊

    经过几个项目的洗礼,对Zebra打印机有了一个初步的了解,也用了好几种方式进行通讯打印,下面我们来谈谈这几种方式的优缺点吧. 主要有以下三种方法: 1.利用ZPLII指令集编写带有位置信息,字体大小, ...

  7. Android打印机--TSC 标签打印

    打印机按照连接方式分为USB打印机.蓝牙打印机.网络打印机.云打印机.内联打印机:按照打印纸张大小分为带切刀的80厨房打印机和58热敏票据打印机:按照打印结果分为小票打印机和标签打印机:关于小票打印, ...

  8. C#调用斑马打印机打印条码标签(支持COM/LPT/USB/ZPL/EPL/Bitmap)

    利用标签设计软件做好模板,打印至本地文件,把其中的ZPL.EPL指令拷贝出来,替换其中动态变化的内容为变量名,做成一个模板文本,在代码中动态替换变量,再把指令输出至打印机. ZebraPrintHel ...

  9. java 绘图 打印_java调用本地打印机,绘制打印模板,小票模板

    文章目录 jar资源 绘制打印模板 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java ...

最新文章

  1. 【 FPGA 】设置伪路径
  2. JsonCpp的简单使用方法
  3. Python应用实战-在Python中进行数据处理操作的几种方法
  4. Java堆内存是线程共享的!面试官:你确定吗?
  5. python的openpyxl库如何读取特定列_通过渲染一百万个网页,来了解网络是如何崩溃的...
  6. initrd镜像文件的作用与制作
  7. 对Java泛型的简单理解
  8. 二、操作系统——用信号量机制实现进程互斥、同步、前驱关系(详解)
  9. 根据分类id找出父类id
  10. python3获取用户输入_python3.4控制用户输入与输出
  11. 产品运营周报报表分析案例
  12. 4j设置文件保存天数_文件备份很麻烦,各种工作不知道怎么选择,容器时代的备份方案!...
  13. JMeter基础之组件的作用域与执行顺序
  14. 20200221_2_国家非文化遗产聚类分析
  15. 如何设置unobtrusive的语言包
  16. FreeFileSync - 最佳免费开源文件夹同步备份软件 (FTP/局域网/移动硬盘)
  17. 计算机网络机房巡视表,机房巡查记录表.doc
  18. java jdom 包_org.jdom jar包下载
  19. 怎么把音频转换成mp3格式?
  20. 不是因为寂寞才想你计算机谱子,不是因为寂寞才想你曲谱

热门文章

  1. 王道论坛机试指南学习笔记(三)数学问题
  2. 在 mac 电脑上安装 odbc 驱动;excel for mac 连接数据库
  3. 黑客就在你身边 - 通过名片怎么黑掉你
  4. 遍历dataframe每一行的每一个元素
  5. php邮件服务器搭建,php发送邮件,不需要搭建邮件服务器方法
  6. VSCode取消references的方法记录
  7. python与人工智能关系论文_《Python深度学习》笔记:人工智能、机器学习与深度学习关系...
  8. win10语言栏不见了_win7语言栏很重要,如果不见了怎么办?
  9. 社区投稿 | DBLE 自定义拆分算法
  10. sqlsugar 多租户设置AOP