ZPL语言完成条形码的打印
近期因为项目的需求,需要使用到打印机来打印业务相关的条形码和其他信息,由于之前有操作其它打印机的经验,Leader就安排我来做这个了(凑哦,这能说我是懵逼的么)。于是就开始了我的探索之旅啦,不对,是踩坑之旅,总的来说还是蛮顺利的,这里就稍微总结一下经验。
ZPL(Zebra Programming Language)是斑马公司自主设计的语言(斑马公司的业务主要是制作斑马条形码打印机)。如今大部分条码打印机都是能够识别ZPL指令的,我们能够用ZPL指令编写一个模板,然后将自己主动生成的条形码值(字符串)依照一定格式格式化成新的字符串。然后将这些内容传入打印机就可以。
下面是ZPL语言的含义:
^XA——开始标签格式
^LH0,0——打印的原点位置
^F0203,203——文本开始位置
^ADN,30,30——字体类型与大小
^FDExampleString——打印正文字符串,FD后为打印的内容
^FS ——无特殊含义,一般用在一段指令段的结尾
^XZ ——结束标签格式
^BY2.0,3.0——条码线条的粗细
^B7N,5,3,,,N ——二维码的长宽比
^BCN,120,Y,N,N,A——条形码的高度
了解上面的这些指令之后就可以写一个完整的指令,来打印条形码。
^XA^LH10,10^FO90,60^ADN,20,10^BY2.0,3.0^BCN,120,Y,N,N,A^FDL000001^FS^XZ

除了上面的指令之外,当然还需要指令的发出者——后台代码,这里我是用Android(Java代码)实现的,下面贴出代码,希望能给有需要的人一些参考。
import com.tao.admin.loglib.Logger;import com.zebra.sdk.comm.BluetoothConnection;import com.zebra.sdk.comm.Connection;import com.zebra.sdk.comm.ConnectionException;import com.zebra.sdk.comm.TcpConnection;import com.zebra.sdk.printer.PrinterLanguage;import com.zebra.sdk.printer.ZebraPrinter;import com.zebra.sdk.printer.ZebraPrinterFactory;import com.zebra.sdk.printer.ZebraPrinterLanguageUnknownException;public class PrinterHelper { private static ZebraPrinter printer; private static Connection printerConnection; public static void printStr(final String printStr){ //新开线程中执行打印操作 new Thread(new Runnable() { @Override public void run() { printer = connect(); if (printer != null) { sendLabel(printer,printerConnection,printStr); } else { disconnect(printerConnection); } } }).start(); } public static ZebraPrinter connect() { printerConnection = null; try { int port = Integer.parseInt("9100"); //和打印机1对1匹配 printerConnection = new TcpConnection("10.240.161.228", port); } catch (NumberFormatException e) { Logger.e("Printer Error 1", e.getMessage()); return null; } try { printerConnection.open(); } catch (ConnectionException e) { Logger.e("Printer Error 2-1", e.getMessage()); PrinterHelper.disconnect(printerConnection); } ZebraPrinter printer = null; if (printerConnection.isConnected()) { try { printer = ZebraPrinterFactory.getInstance(printerConnection); PrinterLanguage pl = printer.getPrinterControlLanguage(); } catch (ConnectionException e) { Logger.e("Printer Error 2-2", e.getMessage()); printer = null; PrinterHelper.disconnect(printerConnection); } catch (ZebraPrinterLanguageUnknownException e) { Logger.e("Printer Error 3", e.getMessage()); printer = null; PrinterHelper.disconnect(printerConnection); } } return printer; } private static void sendLabel(ZebraPrinter printer,Connection printerConnection,String printStr) { try { byte[] configLabel = getConfigLabel(printer,printerConnection,printStr); printerConnection.write(configLabel); if (printerConnection instanceof BluetoothConnection) { String friendlyName = ((BluetoothConnection) printerConnection).getFriendlyName(); } } catch (ConnectionException e) { Logger.e("Printer Error 2-3", e.getMessage()); } finally { disconnect(printerConnection); } } /** * 发送打印指令到打印机 * @return */ private static byte[] getConfigLabel(ZebraPrinter printer,Connection printerConnection,String printStr) { PrinterLanguage printerLanguage = printer.getPrinterControlLanguage(); byte[] configLabel = null; if (printerLanguage == PrinterLanguage.ZPL) { Logger.e("Print Language","ZPL"); configLabel = ("^XA^LH10,10^FO90,60^ADN,20,10^BY2.0,3.0^BCN,120,Y,N,N,A^FD"+printStr+"^FS^XZ").getBytes(); } else if (printerLanguage == PrinterLanguage.CPCL) { Logger.e("Print Language","CPCL"); String cpclConfigLabel = "! 0 200 200 406 1\r\n" + "ON-FEED IGNORE\r\n" + "BOX 20 20 380 380 8\r\n" + "T 0 6 137 177 TEST\r\n" + "PRINT\r\n"; configLabel = cpclConfigLabel.getBytes(); } return configLabel; } public static void disconnect(Connection printerConnection) { try { if (printerConnection != null) { printerConnection.close(); } } catch (ConnectionException e) { Logger.e("Printer Error 2-4", e.getMessage()); } }}
调用打印机打印条形码:PrinterHelper.printStr("L000001");
注意:1,打印机必须要和发指令的设备(比如手机,扫描机)联网,可以通过wifi或者蓝牙,建议使用蓝牙,因为比较稳定。
2,使用上面代码记得导入相关的jar包(在build.gradle里加入api files('libs/ZSDK_ANDROID_API.jar')的dependency)。
码字不易,如果觉得有帮助,一定要给我点赞哟~~
不然信不信我砸了你家灯,半夜偷亲你 ( ̄ε  ̄) !!!
ZPL语言完成条形码的打印的更多相关文章
- C#-利用ZPL语言完毕条形码的生成和打印
近期由于公司项目的须要,研究了一项对我来说算是新的技术-条形码的生成和打印.由于之前没有接触过这方面的知识,所以刚開始还有点小迷茫和小兴奋,只是一步一步来,问题总会解决的.如今来总结一下做条形码 ...
- 吉特仓库管理系统- 斑马打印机 ZPL语言的腐朽和神奇
上一篇文章说到了.NET中的打印机,在PrintDocument类也暴露一些本质上上的问题,前面也提到过了,虽然使用PrintDcoument打印很方便.对应条码打印机比如斑马等切刀指令,不依赖打印机 ...
- 在doc下面执行zpl语言 Copy 文件名 lpt1
在doc下面执行zpl语言 Copy 文件名 lpt1 测试斑马条码打印机并口是否能正常通讯: 1.Zebra打印机安装好标签和碳带,且打印机进入Ready状态.2.电脑端用Notepad编写输入如下 ...
- C语言利用for循环打印菱形
C语言利用for循环打印菱形(高度为奇数) 这次用的方法是上下部分分开打印,先打印上部分,再打印下部分. 先举个简单的例子打印,再改进代码,登堂入室从而理解. 例:打印一个高度(高度必须为奇数)为 5 ...
- ZPL语言说明文档
■格式命令(format commands) 以︿开始 用于设定标签格式与数据 多条格式指令按顺序执行 ■控制指令(control commands) 以~开始 迫使打印机立即执行某一个指令的操作 可 ...
- winfrom 实现条形码批量打印以及将条形码信息生成PDF文件
最近,老大让给客户做个邮包管理程序.其中,包括一些基本信息的增.删.查和改,这些倒不是很难搞定它分分钟的事.其主要难点就在于如何生成条形码.如何批量打印条形码以及将界面条形码信息批量生成以其各自的 b ...
- C语言 · c++_ch02_01(打印元音字母的ASCII码)
算法提高 c++_ch02_01 时间限制:1.0s 内存限制:512.0MB 编写一个程序,利用强制类型转换打印元音字母大小写10种形式的ASCII码. 输出的顺序为:大写的字母A ...
- C语言基础--循环 递归打印乘法表
for循环打印乘法表: #include <stdio.h> // for循环打印乘法表 int main(int argc, const char * argv[]) { //矩形 ; ...
- C语言 链表的创建--打印--逆置--新增--删除--排序--释放
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string. ...
随机推荐
- 安卓 通过intent调用系统文件管理器打开指定路径目录
安卓 通过intent调用系统文件管理器打开指定路径目录 转 https://blog.csdn.net/qq_34161388/article/details/78586247 当我们知道 ...
- 工作流调度器之Azkaban
Azkaban 1. 工作流调度器概述 1.1. 为什么需要工作流调度系统 一个完整的数据分析系统通常都是由大量任务单元组成:shell脚本程序,java程序,mapreduce程序.hive脚本等 ...
- Json_DataMember签名作用
[DataContract] public class ApiResponse { [DataMember] public string Time { get; set; } } 序列化和反序列,如果 ...
- Canal——写入到ES中数据错乱
问题描述 使用canal-adapter写入elasticSearch数据时,数据是写入了elasticSearch了,但出现了mysql表中的数据和elasticSearch中索引中的数据错乱的问题 ...
- PHP初中高级学习在线文档下载
收集了一些框架的学习文档与手册,视频教程,给大家带来了更多的方便,只要收藏与保存于百度云盘就好了,省去了网上到处寻找的时间!大家有需要就收藏保存起来吧! 如果不能下载请到群内获取新的下载地址 QQ群 ...
- .Netcore 2.0 Ocelot Api网关教程(9)- QoS
本文介绍Ocelot中的QoS(Quality of Service),其使用了Polly对超时等请求下游失败等情况进行熔断. 1.添加Nuget包 添加 Ocelot.Provider.Polly ...
- Django之会话机制cookie、session使用
login视图函数: def login(request): if request.method == 'POST': username = request.POST.get('username') ...
- C#中异步编程异常的处理方式
异步编程异常处理 在同步编程中,一旦出现错误就会抛出异常,我们可以使用try-catch来捕捉异常,未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制.但是对于异步编程来说,异常处理一直 ...
- Java集合框架——List接口
第三阶段 JAVA常见对象的学习 集合框架--List接口 按照集合框架的继承体系,我们先从Collection中的List接口开始学习 (一) 概述及功能(ArrayList演示) (1) 概述 L ...
- [转帖]POWER ISA开源 浪潮商用机器加速POWER技术生态建设步伐
POWER ISA开源 浪潮商用机器加速POWER技术生态建设步伐 [原创] 2019-08-26 18:51:04 关键字: 开源 Power 浪潮商用机器 http://server.zhid ...