近期因为项目的需求,需要使用到打印机来打印业务相关的条形码和其他信息,由于之前有操作其它打印机的经验,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语言完成条形码的打印的更多相关文章

  1. C#-利用ZPL语言完毕条形码的生成和打印

     近期由于公司项目的须要,研究了一项对我来说算是新的技术-条形码的生成和打印.由于之前没有接触过这方面的知识,所以刚開始还有点小迷茫和小兴奋,只是一步一步来,问题总会解决的.如今来总结一下做条形码 ...

  2. 吉特仓库管理系统- 斑马打印机 ZPL语言的腐朽和神奇

    上一篇文章说到了.NET中的打印机,在PrintDocument类也暴露一些本质上上的问题,前面也提到过了,虽然使用PrintDcoument打印很方便.对应条码打印机比如斑马等切刀指令,不依赖打印机 ...

  3. 在doc下面执行zpl语言 Copy 文件名 lpt1

    在doc下面执行zpl语言 Copy 文件名 lpt1 测试斑马条码打印机并口是否能正常通讯: 1.Zebra打印机安装好标签和碳带,且打印机进入Ready状态.2.电脑端用Notepad编写输入如下 ...

  4. C语言利用for循环打印菱形

    C语言利用for循环打印菱形(高度为奇数) 这次用的方法是上下部分分开打印,先打印上部分,再打印下部分. 先举个简单的例子打印,再改进代码,登堂入室从而理解. 例:打印一个高度(高度必须为奇数)为 5 ...

  5. ZPL语言说明文档

    ■格式命令(format commands) 以︿开始 用于设定标签格式与数据 多条格式指令按顺序执行 ■控制指令(control commands) 以~开始 迫使打印机立即执行某一个指令的操作 可 ...

  6. winfrom 实现条形码批量打印以及将条形码信息生成PDF文件

    最近,老大让给客户做个邮包管理程序.其中,包括一些基本信息的增.删.查和改,这些倒不是很难搞定它分分钟的事.其主要难点就在于如何生成条形码.如何批量打印条形码以及将界面条形码信息批量生成以其各自的 b ...

  7. C语言 · c++_ch02_01(打印元音字母的ASCII码)

    算法提高 c++_ch02_01   时间限制:1.0s   内存限制:512.0MB      编写一个程序,利用强制类型转换打印元音字母大小写10种形式的ASCII码. 输出的顺序为:大写的字母A ...

  8. C语言基础--循环 递归打印乘法表

    for循环打印乘法表: #include <stdio.h> // for循环打印乘法表 int main(int argc, const char * argv[]) { //矩形 ; ...

  9. C语言 链表的创建--打印--逆置--新增--删除--排序--释放

    #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string. ...

随机推荐

  1. Flask之加载静态资源

    Flask之加载静态资源 1.加载css样式 <link rel="stylesheet" href="{{ url_for('static',filename=' ...

  2. 16 Flutter仿京东商城项目 跳转到搜索页面实现搜索功能 以及搜索筛选

    ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...

  3. spark入门备忘---1

    import org.apache.spark.{SparkContext, SparkConf} import scala.math.random /** * 利用spark进行圆周率的计算 */ ...

  4. eclipse、MyEclipse 修改字符集和JDK

    eclipse 中UTF-8设置 1.windows->Preferences   打开"首选项"对话框: 2.然后,general->Workspace,右 侧Tex ...

  5. EasyUI中对datagrid的扩展方法

    以下是给datagrid扩展一个方法的demo 1.给datagrid添加一个属性 $.extend($.fn.datagrid.defaults, { demo: "demo1" ...

  6. rabbitmq-BasicReject

    拒收,是接收端在收到消息的时候响应给RabbitMQ服务的一种命令,告诉服务器不应该由我处理,或者拒绝处理,扔掉.接收端在发送reject命令的时候可以选择是否要重新放回queue中.如果没有其他接收 ...

  7. fatal error: nvcuvid.h: No such file

    https://www.cnblogs.com/rabbull/p/11154997.html

  8. 深入理解java:5. Java分布式架构

    什么是分布式架构 分布式系统(distributed system)是建立在网络之上的软件系统. 内聚性是指每一个数据库分布节点高度自治,有本地的数据库管理系统. 透明性是指每一个数据库分布节点对用户 ...

  9. eNSP——利用单臂路由实现VLAN间路由

    原理: 以太网中,通常会使用VLAN技术隔离二层广播域来减少广播的影响,并增强网络的安全性和可管理性.其缺点是同时也严格地隔离了不同VLAN之间的任何二层流量,使分属于不同VLAN的用户不能直接互相通 ...

  10. java 面试题汇总

    一.Java 基础 1.JDK 和 JRE 有什么区别? JDK是java开发工具包,提供java的开发环境和运行环境.包括编译器.开发工具和更多的类库等.JDK包含了JRE. JRE是java运行环 ...