Zebra 条码打印机应用开发实践

来源:互联网 发布:ubuntu以管理员登录 编辑:程序博客网 时间:2024/03/29 01:11

这次做了个项目 其中有一个需求是控制条码机
要求一是能打印条码 二是能打印中文的经销商名称 还有打印一个位图徽标
测试环境是 Windows 2000/XP/2003 条码机是 Zebra 的 Z4M Plus
因为以前没有做过条码机 所以一开始想得比较简单 觉得通过打印驱动应该就搞定了
开始编码测试时发现 控制 Zebra 的打印驱动的确是可以按常规的打印机处理 但有两个缺陷
一是对打印内容的位置和效果控制不精确 二是打印速度不行
而且客户方有若干种不同型号的机器 要一一安装对应的驱动 这也的确是个麻烦事
所以就试着通过串口直接控制条码机

Zebra 系列内置了其自定义的 ZPL 通讯命令集
这其实也几乎是目前主流品牌机型都支持的标准规范
ZPL 的具体命令内容很多 提供了对条码机方方面面巨细不遗的控制
网上很多文章提到了指令的用法 不再赘述
更多详细的指令说明可以查阅 Zebra 的命令手册

一、条码的打印
条码机打印条码非常简单
发送的指令通常包括了对标签尺寸、条码位置、条码尺寸、条码类型的设置和具体的条码内容。

例:
 ^XA^LH0,0^FO130,44^FO20,25^BY4^FO100,100^BCN,104,Y,N,N^FD>;0123456789^FS^PQ1^XZ

注:
 该指令序列将打印 CODE 128 规范的 0-9 的一维数字条码

二、中文的打印
网上有文章提到 可以用一个名为 fnthex32.dll 的库 里面导出了一个 GetFontHex 函数
功能是将传入的中文字符串转换为十六进制编码并返回 这个库在网上不太好找 在我做完项目之后数天 有幸找到了一个
想来用起来应该是比较方便 不过项目做完 没有条码机测试了 需要的朋友可以试一下

三、图形的打印
上面提到的 GetFontHex 函数 不知道是不是也是把汉字转换成图形编码的 个人猜想应该是
所以其实条码机打印非标准字符和打印图形应该是同样的方法
对图形的处理 重点在于要将图形进行编码 再加上指令发送就行了
编码的方法比较简单 非常类似于 DOS 下中文平台中点阵汉字库的编码
即一个点用一个位(bit)表示 每个字节描述 8 个点 先行后列 从上到下
也就是说 条码机能打印的只能是二值图像
编码的时候需要注意的是 如果每行结束时字节未填满 应向上扩充至整字节(用 0 填位)

了解了编码方式 就比较容易处理了
网上有方案提出 直接从点阵汉字库里取点阵数据 这个方法个人觉得不太灵活
一是点阵字库较大 发布麻烦 二是文字大小受限
我的实现方法是 直接使用 API 向内存 Bitmap 画出汉字 这样汉字的字体和大小可以很方便地控制
然后扫描出点阵信息 经过编码 生成最终数据
比如确定好画成白底黑色 编码时白字当作 0 黑点当作 1
最终生成的数据 需要按图形方式下载到条码机缓存内
输出的时候指定使用该图形即可
另外需要注意的是 下载图形指令 ^DG 需要带上几个参数 分别指出图形缓存名称和图形的总字节数及每行字节数
这两个数字需要计算好 再拼接到命令串中

总字节数计算方法:
 ( 图形宽度 * dpm / 8 ) * ( 图形高度 / 8 )
 dpm 是分辨率 即每毫米点数(Dots Per mm)

每行字节数计算方法:
 ( 图形宽度 / 8 )

比如图形为 664 x 40  dpm 为 8(通常取这个值)
 则总字节数 = ( 664 * 8 / 8 ) * ( 40 / 8 ) = 3320 字节
 每行字节数 = ( 664 / 8 ) = 83 字节

例:
 ^XA^LH0,0^IDR:*.*^XZ~DGIMG0,3320,83,...(编码后的数据)...^PQ1^XZ
注:
 该指令将编码后的图形数据下载至条码机 并指定保存到别名为 IMG0 的缓存区域中
 之后 用 ^XG 指令即可引用该图形


//*******************
// 需要注意的问题:
//*******************
一、分辨率
如果分辨率不是标准的 8dpm 经测试 Zebra Z4M Plus 对数据的处理有时候会有 Error 状态发生
在 S 系列上则完全正常
但愿是我的方法或代码有问题

二、处理速度
串口发送数据速度较慢 经测试 3320 字节大小的数据从发送到打印完成平均需要 0.5 秒左右
好在这次项目标签尺寸并不大 速度尚在可接受范围内
若对速度有更高要求 可以考虑使用并口
USB 口也许更快 但未经测试 不知道方法是否通用

这里只记录了我涉及到的应用 记性太差 以后再有类似开发时有案可查 不至于从头再弄
也但愿能给刚开始接触且需要处理条码机应用的朋友一些拙劣的启发

欢迎同好研究探讨: scumyang@163.com

scum
2006-08-07