吉特仓库管理系统- 斑马打印机 ZPL语言的腐朽和神奇
上一篇文章说到了.NET中的打印机,在PrintDocument类也暴露一些本质上上的问题,前面也提到过了,虽然使用PrintDcoument打印很方便。对应条码打印机比如斑马等切刀指令,不依赖打印机驱动等等PrintDocuent显得无能为力。在开发吉特仓储管理系统(开源托管在github: https://github.com/hechenqingyuan/gitwms 有兴趣可以加本人QQ 821865130 或者Q群 88718955, 142050808 了解)的过程中遇到了各种打印上的问题,本篇文章主要记录利用串口接收ZPL指令来驱动斑马打印机打印。
一. 使用场景
1. 使用斑马条码打印机打印标签或票据
2. 要支持条码,二维码,图片,中文的打印
3. 能够自定义打印模板
4. 使用串口(COM口)通信
5. 不要安装斑马打印机驱动
6. 斑马打印机自动切纸
以上场景和上一篇文章的大同小异,重点提到了支持COM口以及不要安装斑马打印机驱动,并且要能够在斑马打印机上启动切纸,这个和上一篇文章的不同之处在于此,也就理解为不同需求。PrintDocument 也是支持串口的,只要将打印机连接通信方式修改为串口也就可以,但是提到了不使用驱动以及切刀自动切纸,PrintDocument也就无能为力了。
仍然以以上订单票据为案例,以上效果是今天用ZPL指令打印出来的效果图,基本和PrintDocument打印的效果差不多,具体可以详看上一篇文章。
二.ZPL 是个什么鬼
ZPL是个什么东西,不用惊慌,是斑马打印机上的一种机器语言,更多关于ZPL的信息可以百度搜索一下。 机器语言老套,哥对此恨之入骨,奥涩难懂。做一个打印有这么麻烦么。
- ^XA^MMT^LS0^BY4,3,41^FT40,41^BCN,,Y,N^FD>;123456^FS^PQ1,0,1,Y^XZ
以上是ZPL指令语言的一个样本,能看懂么?第一眼看过去我就不想往下看了,你也不得不相信他的神奇之处,这段文字你使用doc命令就可以直接调用斑马打印机打印。使用ZPL指令打印就必须先了解ZPL语言特性,了解各种指令的意思,奥涩难懂也是没有办法的,只有了解了才能正确的使用。
ZPL指令详解推荐文件:http://www.cnblogs.com/hikarusun/archive/2012/08/10/2631707.html
对于想学ZPL指令的我也只能帮你到这些了,慢慢 研究吧,更多详细内容可以参考官网文档,英文也够难读的。
几个重要的指令:
1. 开始指令 ^XA
2. 结束指令 ^XZ
3. 打印边距指令 ^LH
4. 打印纸张大小指令 ^LH
5. 切刀指令 ^MM
6. 设置字符位置指令 ^FO
7. 设置字符结束指令 ^FS
8. 下载图像指令 ^DG
9. 调用图像指令 ^XG
10. 二维码指令 ^BQ
11. 条码指令 ^BC
ZPL中使用到的指令太多,这里不过多的讲解,要了解指令的参考推荐的文章。
三. 自定义模板
为了兼容上一篇文章中所用到的模板,在模板设置上我们保持不变,在打印程序运行解析的过程中仍然使用该模板。
- <?xml version="1.0" encoding="utf-8" ?>
- <Page Width="200" Heigth="700" DefaultPrinter="ZDesigner GK888t (EPL)">
- <Line Height="72">
- <Image Left="20" Top="30">{{Logo}}</Image>
- </Line>
- <Line Height="50">
- <Text Left="50" Top="2" FontSize="15">预定凭条</Text>
- </Line>
- <Line Height="30">
- <Text Left="15" Top="2" FontSize="16">保税区1店</Text>
- </Line>
- <Line Height="20">
- <Text Left="70" Top="2" FontSize="8">No.150 page.1</Text>
- </Line>
- <Line Height="70">
- <QRCode Left="20" Top="2" >{{OrderCode}}</QRCode>
- </Line>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="10">单据号:{{OrderCode}}</Text>
- </Line>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="10">提货时间:{{DtReceive}}</Text>
- </Line>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="10">提货点:{{ReceiveAddress}}</Text>
- </Line>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="10">联系人:{{ReceiveUser}}</Text>
- </Line>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="10">联系电话:{{ReceiverPhone}}</Text>
- </Line>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="10">时间:{{DtCreate}}</Text>
- </Line>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="18">-------------</Text>
- </Line>
- <Line Height="30">
- <Text Left="2" Top="2" FontSize="7">序号</Text>
- <Text Left="30" Top="2" FontSize="7">货号</Text>
- <Text Left="70" Top="2" FontSize="7">品名</Text>
- <Text Left="30" Top="17" FontSize="7">数量</Text>
- <Text Left="70" Top="17" FontSize="7">单价</Text>
- <Text Left="150" Top="17" FontSize="7">金额</Text>
- </Line>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="18">-------------</Text>
- </Line>
- <Loop Values="Detials">
- <Line Height="30">
- <Text Left="2" Top="2" FontSize="7">{{Index}}</Text>
- <Text Left="30" Top="2" FontSize="7">{{StrID}}</Text>
- <Text Left="70" Top="2" FontSize="7">{{StrName}}</Text>
- <Text Left="30" Top="17" FontSize="7">{{DCount}}</Text>
- <Text Left="60" Top="17" FontSize="7">*</Text>
- <Text Left="70" Top="17" FontSize="7">{{DPrice}}</Text>
- <Text Left="140" Top="17" FontSize="7">=</Text>
- <Text Left="150" Top="17" FontSize="7">{{DAmount}}</Text>
- </Line>
- </Loop>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="18">-------------</Text>
- </Line>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="7">联机刷卡</Text>
- <Text Left="100" Top="2" FontSize="7">人民币{{DAmount}}</Text>
- </Line>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="18">--------------</Text>
- </Line>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="7">商品数:{{DCount}}</Text>
- <Text Left="100" Top="2" FontSize="7">总金额:{{DAmount}}</Text>
- </Line>
- <Line Height="70">
- <BarCode Left="20" Top="2" Width="100" Height="60">{{OrderCode}}</BarCode>
- </Line>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="18">--------------</Text>
- </Line>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="7">谢谢惠顾,欢迎再次光临</Text>
- </Line>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="7">提货凭据,请妥善保管</Text>
- </Line>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="7">客服热线:*******</Text>
- </Line>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="7"></Text>
- </Line>
- <Line Height="20">
- <Text Left="2" Top="2" FontSize="7"></Text>
- </Line>
- </Page>
模板文件
模板的解析方式仍然不变,这里要注意一下使用ZPL打印的时候,在计算字体大小使用的单位和PrintDocument中GDI+画图的单位是不一样的,具体是怎样一种转换比例目前还没有完全弄明白,所以在打印的时候要调整模板中的相应值。
四.代码详解
不多说直接上代码,一下是ZPL指令转换的核心代码,在网上也可以看到,自己修改了一部分,拿去用即可。
- public partial class ZplPrintControl
- {
- public string ZPL_Start()
- {
- StringBuilder builder = new StringBuilder();
- builder.AppendLine("^XA"); //指令块的开始
- builder.AppendLine("^MMC,Y");
- builder.AppendLine("^PRE,E");
- builder.AppendLine("^MD30"); //MD是设置色带颜色的深度
- builder.AppendLine("^LH0,0");
- builder.AppendLine("^ABN,50,50");
- builder.AppendLine("^CW1,D:MSUNG.FNT");
- builder.AppendLine("^SEE:GB8BIT.DAT");
- builder.AppendLine("^CI26");
- return builder.ToString();
- }
- public string ZPL_End()
- {
- StringBuilder builder = new StringBuilder();
- builder.AppendLine("^XZ"); //指令块的结束
- return builder.ToString();
- }
- /// <summary>
- /// 设置打印标签纸边距
- /// </summary>
- /// <param name="printX">标签纸边距x坐标</param>
- /// <param name="printY">标签纸边距y坐标</param>
- /// <returns></returns>
- public string ZPL_PageSet(int printX, int printY)
- {
- StringBuilder builder = new StringBuilder();
- builder.AppendLine("^LH" + printX + "," + printY); //定义条码纸边距 80 10
- return builder.ToString();
- }
- /// <summary>
- /// 打印凭条设置
- /// </summary>
- /// <param name="width">凭条宽度</param>
- /// <param name="height">凭条高度</param>
- /// <returns>返回ZPL命令</returns>
- public string ZPL_SetLabel(int width, int height)
- {
- //ZPL条码设置命令:^PW640^LL480
- string sReturn = "^PW{0}^LL{1}";
- return string.Format(sReturn, width, height);
- }
- /// <summary>
- /// 打印矩形
- /// </summary>
- /// <param name="px">起点X坐标</param>
- /// <param name="py">起点Y坐标</param>
- /// <param name="thickness">边框宽度</param>
- /// <param name="width">矩形宽度,0表示打印一条竖线</param>
- /// <param name="height">矩形高度,0表示打印一条横线</param>
- /// <returns>返回ZPL命令</returns>
- public string ZPL_DrawRectangle(int px, int py, int thickness, int width, int height)
- {
- //ZPL矩形命令:^FO50,50^GB300,200,2^FS
- string sReturn = "^FO{0},{1}^GB{3},{4},{2}^FS";
- return string.Format(sReturn, px, py, thickness, width, height);
- }
- /// <summary>
- /// 打印英文
- /// </summary>
- /// <param name="EnText">待打印文本</param>
- /// <param name="ZebraFont">打印机字体 A-Z</param>
- /// <param name="px">起点X坐标</param>
- /// <param name="py">起点Y坐标</param>
- /// <param name="Orient">旋转角度N = normal,R = rotated 90 degrees (clockwise),I = inverted 180 degrees,B = read from bottom up, 270 degrees</param>
- /// <param name="Height">字体高度</param>
- /// <param name="Width">字体宽度</param>
- /// <returns>返回ZPL命令</returns>
- public string ZPL_DrawENText(string EnText, string ZebraFont, int px, int py, string Orient, int Height, int Width)
- {
- //ZPL打印英文命令:^FO50,50^A0N,32,25^FDZEBRA^FS
- string sReturn = "^FO{1},{2}^A" + ZebraFont + "{3},{4},{5}^FD{0}^FS";
- return string.Format(sReturn, EnText, px, py, Orient, Height, Width);
- }
- /// <summary>
- /// 中文处理,返回ZPL命令
- /// </summary>
- /// <param name="ChineseText">待转变中文内容</param>
- /// <param name="FontName">字体名称</param>
- /// <param name="startX">X坐标</param>
- /// <param name="startY">Y坐标</param>
- /// <param name="Orient">旋转角度0,90,180,270</param>
- /// <param name="Height">字体高度</param>
- /// <param name="Width">字体宽度,通常是0</param>
- /// <param name="IsBold">1 变粗,0 正常</param>
- /// <param name="IsItalic">1 斜体,0 正常</param>
- /// <returns></returns>
- public string ZPL_DrawCHText(string ChineseText, string FontName, int startX, int startY, int Orient, int Height, int Width, int IsBold, int IsItalic)
- {
- StringBuilder sResult = new StringBuilder();
- StringBuilder hexbuf = new StringBuilder( * );
- int count = ZplPrintControl.GETFONTHEX(ChineseText, FontName, Orient, Height, Width, IsBold, IsItalic, hexbuf);
- if (count > )
- {
- string sEnd = "^FO" + startX.ToString() + "," + startY.ToString() + "^XGOUTSTR" + ",1,2^FS ";
- sResult.AppendLine(hexbuf.ToString().Replace("OUTSTR01", "OUTSTR") + sEnd);
- }
- return sResult.ToString();
- }
- /// <summary>
- /// 打印条形码(128码)
- /// </summary>
- /// <param name="px">起点X坐标</param>
- /// <param name="py">起点Y坐标</param>
- /// <param name="width">基本单元宽度 1-10</param>
- /// <param name="ratio">宽窄比 2.0-3.0 增量0.1</param>
- /// <param name="barheight">条码高度</param>
- /// <param name="barcode">条码内容</param>
- /// <returns>返回ZPL命令</returns>
- public string ZPL_DrawBarcode(int px, int py, int width, int ratio, int barheight, string barcode)
- {
- //ZPL打印英文命令:^FO50,260^BY1,2^BCN,100,Y,N^FDSMJH2000544610^FS
- string sReturn = "^FO{0},{1}^BY{2},{3}^BCN,{4},N,N^FD{5}^FS";
- return string.Format(sReturn, px, py, width, ratio, barheight, barcode);
- }
- /// <summary>
- /// 打印二维码
- /// </summary>
- /// <param name="px"></param>
- /// <param name="py"></param>
- /// <param name="cl"></param>
- /// <param name="bch"></param>
- /// <param name="qrCode"></param>
- /// <returns></returns>
- public string ZPL_DrawQRCode(int px, int py, int cl, int bch, string qrCode)
- {
- StringBuilder sb = new StringBuilder();
- sb.AppendFormat("^FO{0},{1}", px, py);
- sb.Append("^BQ,2,7");
- sb.AppendFormat("^FDLA,{0}^FS", qrCode);
- return sb.ToString();
- }
- }
ZPL指令转换代码
以上代码缺少打印图片部分的代码,这个在后续单独讲解为什么
中文打印有点特殊,斑马打印机本身对中文支持性不好,这里我们需要使用到动态链接库fnthex32.dll,可以到网上搜索下载一下此链接库,并且可以注册到系统中
- /// <summary>
- /// 中文处理,返回ZPL命令
- /// </summary>
- /// <param name="ChineseText">待转变中文内容</param>
- /// <param name="FontName">字体名称</param>
- /// <param name="startX">X坐标</param>
- /// <param name="startY">Y坐标</param>
- /// <param name="Orient">旋转角度0,90,180,270</param>
- /// <param name="Height">字体高度</param>
- /// <param name="Width">字体宽度,通常是0</param>
- /// <param name="IsBold">1 变粗,0 正常</param>
- /// <param name="IsItalic">1 斜体,0 正常</param>
- /// <returns></returns>
- public string ZPL_DrawCHText(string ChineseText, string FontName, int startX, int startY, int Orient, int Height, int Width, int IsBold, int IsItalic)
- {
- StringBuilder sResult = new StringBuilder();
- StringBuilder hexbuf = new StringBuilder( * );
- int count = ZplPrintControl.GETFONTHEX(ChineseText, FontName, Orient, Height, Width, IsBold, IsItalic, hexbuf);
- if (count > )
- {
- string sEnd = "^FO" + startX.ToString() + "," + startY.ToString() + "^XGOUTSTR" + ",1,2^FS ";
- sResult.AppendLine(hexbuf.ToString().Replace("OUTSTR01", "OUTSTR") + sEnd);
- }
- return sResult.ToString();
- }
中文打印支持
加载动态链接库的使用方式如下:
- /// <summary>
- /// 中文处理
- /// </summary>
- /// <param name="ChineseText">待转变中文内容</param>
- /// <param name="FontName">字体名称</param>
- /// <param name="Orient">旋转角度0,90,180,270</param>
- /// <param name="Height">字体高度</param>
- /// <param name="Width">字体宽度,通常是0</param>
- /// <param name="IsBold">1 变粗,0 正常</param>
- /// <param name="IsItalic">1 斜体,0 正常</param>
- /// <param name="ReturnPicData">返回的图片字符</param>
- /// <returns></returns>
- [DllImport("fnthex32.dll")]
- public static extern int GETFONTHEX(
- string ChineseText,
- string FontName,
- int Orient,
- int Height,
- int Width,
- int IsBold,
- int IsItalic,
- StringBuilder ReturnPicData);
- /// <summary>
- /// 中文处理
- /// </summary>
- /// <param name="ChineseText">待转变中文内容</param>
- /// <param name="FontName">字体名称</param>
- /// <param name="FileName">返回的图片字符重命</param>
- /// <param name="Orient">旋转角度0,90,180,270</param>
- /// <param name="Height">字体高度</param>
- /// <param name="Width">字体宽度,通常是0</param>
- /// <param name="IsBold">1 变粗,0 正常</param>
- /// <param name="IsItalic">1 斜体,0 正常</param>
- /// <param name="ReturnPicData">返回的图片字符</param>
- /// <returns></returns>
- [DllImport("fnthex32.dll")]
- public static extern int GETFONTHEX(
- string ChineseText,
- string FontName,
- string FileName,
- int Orient,
- int Height,
- int Width,
- int IsBold,
- int IsItalic,
- StringBuilder ReturnPicData);
中文支持动态链接库
斑马打印机本身就有支持条码和二维码的指令,在最开始没有通读文档的时候根本不清楚哪些指令是支持,哪些不支持。最开始的设想是将条码,二维码都生成图片格式,然后将图片使用ZPL指令打印出来,无赖图片打印出现了问题。
- /// <summary>
- /// 打印条形码(128码)
- /// </summary>
- /// <param name="px">起点X坐标</param>
- /// <param name="py">起点Y坐标</param>
- /// <param name="width">基本单元宽度 1-10</param>
- /// <param name="ratio">宽窄比 2.0-3.0 增量0.1</param>
- /// <param name="barheight">条码高度</param>
- /// <param name="barcode">条码内容</param>
- /// <returns>返回ZPL命令</returns>
- public string ZPL_DrawBarcode(int px, int py, int width, int ratio, int barheight, string barcode)
- {
- //ZPL打印英文命令:^FO50,260^BY1,2^BCN,100,Y,N^FDSMJH2000544610^FS
- string sReturn = "^FO{0},{1}^BY{2},{3}^BCN,{4},N,N^FD{5}^FS";
- return string.Format(sReturn, px, py, width, ratio, barheight, barcode);
- }
打印条形码(128码)
- /// <summary>
- /// 打印二维码
- /// </summary>
- /// <param name="px"></param>
- /// <param name="py"></param>
- /// <param name="cl"></param>
- /// <param name="bch"></param>
- /// <param name="qrCode"></param>
- /// <returns></returns>
- public string ZPL_DrawQRCode(int px, int py, int cl, int bch, string qrCode)
- {
- StringBuilder sb = new StringBuilder();
- sb.AppendFormat("^FO{0},{1}", px, py);
- sb.Append("^BQ,2,7");
- sb.AppendFormat("^FDLA,{0}^FS", qrCode);
- return sb.ToString();
- }
打印二维码
二维码本身是支持中文的,但是在斑马打印机上怎么处理二维码的中文还未能够研究透,如果有了解的可以告知一下处理方式
五. 图片打印
单独讲解图片打印,在网上找了很多的代码讲解图片打印的,我也Copy过一分来打印。网上的案例也千篇一律,不过可以善意的提醒一下这段代码是存在问题的,打印的效果并不尽如人意。从百度中搜索到ZPL打印图片大致可以了解到如下信息:
1. 首先把图片保存到打印机的内存中
2. 斑马打印机支持.GRF 后缀的图形文件
3. 如何使用ZPL加载图片文件
4. 如何生成.GRF 文件资源
在上文中提到了指令^DG 指令:
~DG(下载图象)执行以下功能。
- 置打印机为图象模式。
- 命名图形。(这个名字将用来在标签中调用)
- 定义图象尺寸
- 下载十六进制字符串到打印
直接截图文字来说明问题了,不在废话描述,在推荐的文章中可以看到如上解释说明
- ^DGR:ZONE.GRF,,,{},^LH0,^FO5,^XGR:ZONE.GRF^FS
大抵类似如此的指令用于生成图片的打印。根据网上的算法打印图片效果并不是很好这里建议使用改文档中提到的工具生成指令代码:
- public string ZPL_DrawImage(int px, int py, int cl, int bch, string path)
- {
- StringBuilder sb = new StringBuilder();
- sb.Append("^FO6,50^GFA,04608,04608,00048,:Z64:");
- sb.Append("eJztlz1rHEcYx5/RCI0C4kakuuLQnPAXuHKL860MDrhJHUjjHPkCa6VZkeN2iAqlsgkpYxJBvoaDVjZYDqRw6SLFHHJwEQeNcXCWeLOTZ1527yXgO6lK4S32Vne//e//eZlnRwCQKbjMQU15KZ4bcyleGCMvw2fG5EshZo7rS2OMWkG0CRJ5vQynpjFN8LJYxvOpCboKHzfQtuWXFsD8DSfllfgeW4GnmE1mpny1hHesT1CPr8BzG2uW28vE8ssaKLYFEi5BehX92EqzYmX9TOKJlqvqE6dHqoZf0O8u8j7fjkrnf9q0p5G77BEk3RUtpq6KeT+j5jQeMQlUOl5v24+44d2T3E9lfYqrAfLszNaeqQ5+0xa55UN9mV8FYytn/46rMZfA79lrnsdffdwdMTXjn/mGLR2Pz8uKGHnBrD7PszMUdXzJ/jlxz/T82N+K+kpwvMvxQsbn6IJaA6PQzzP64g8bT97ioUQgQJy/NqXjK2reWJ6qb2r/sRy4TMcyJDJGR5ABqQ04/xKKkEoDfTzvmUxRJT2PeUXQ88Z8mQCs+T9Lv6A1EDW+nZNzm0IYAJGofyU+m86rxNvzA0OUJcuBOn4cusfVUd528zDoZybwcZUgzE7Xb9mgiBV2wbmmsEXy+ngvCXxJcjenLIe3jgOft1z7UBn0JezwPAXu9EXseSytCbx2JQT2+0eF05fQYjnGq7XlhXG+MQGZj0MUxL2PqO+37NOgT9QI+QE3f055W0ZRwvZCv3le2zRUwB7ansy0Fbc8r+b6c1zztMQ045KltufhE1XrhzFn/TT9Zi9phTzz/VaEeD2fe/0c6n5zPKtic4w8qfmsXkx6sd8cLwy/D+zXmm/8k/AeQD4NPBbkGMQb5LEo1JlkjX9iKhn82Btd9DsRJlbzNvg6Nn7csjDm6YI+DJA0SnwNsFXzuo4XO8A9AHld69vlMtK4fANf+3FisU/kTLwQYQUPtNis+dFMfkILzvnvtTFKJdoJdOz3lteNPvPv67q+a137ACaJjjsp7LgV4/SrK/KkmYcF8Im9d01GONrUGHnvZwxsYv2Ese72Btwtqrd4Jkb2kX9V7RSo/7nnL2TD434Ge8jpi1eOx5xJ8lsZW94O/QH+KsN8cO1iA5A3cbzKDPnKrnpyoYVGP7Yd4zl+ccOBb58YM/xCIe/1cR6ap8bPQ29obkNwbBcdvJAYasfxQvLKDpqwTeL/fUF2w+e6dyx5kVUNDz8s2fHxnGm0iEUIx8m7d3w8pwrX+ZSn7+aZopJWIKYQjgJ5aw+68oONtXXYI9s/bq59CN0bsD7ctu/TNZe1qelYsaL86/SijL87fwvm9NWFGbeYiZU5MvPv6+BQb/Sia+rofmtzeC4PlLp5sNMhj/tJMnk8vx8IDouNdjLUh3d5dG0CUaJvHdzbIo8G0f7wYU2SmaRTzSAdlod3N3Z2n0OSKtljPZr3033yc+2EzvCk4HlCRmctLuhLiFKVp7xLfulE+/QZhK0Ym22aEdXRcHD4oMVPS9TXMqGKFLEeu6YR0/1YzZMi2RWHRYtNnkMaqb2U5uTZdZURq8/L+iFX5fuQJrv8qM/J5KXz0yM5eXJd7ZMn4Ic4meuxzlaU3uCPHmxsv1Yy6mG82AJP+jr54hR8v/C5TVtnvd0bkqPveW+o5B2dyAT1MZ/J8NSVqtqdXyNbG+3oBjnkvD38Fut7R6aWH/TTyZnrl8VN/xZX4lDeO/rp5MzIam8AI/bZhhpfNy9clWb+Xwg8riVszD23i3OB+aUVYqSLe851ePeRLez5N5fw7HL/o70/3h/vj//j8S9RSmEa:A5FD^FS");
- return sb.ToString();
- }
根据文档中的说明生成了一个图形ZPL代码指令,此举也是无奈,官网文档上的算法写了一个转换算法,但是并没有奏效,有待继续研究,暂且此种方式来处理。
六. 串口调用打印机
- SerialPort ports = new SerialPort();
- ports.BaudRate = ;
- ports.PortName = this.Com;
- ports.Open();
- ports.WriteLine(GetCommand());
- ports.Close();
串口调用打印机就非常简单了,将转化得到的指令通过串口的方式发送到打印机即可,PortName是打印机连接的串口. 如果不知道串口的通畅情况,可以在网上下载一个串口监测工具来监测串口的当前状态,同时也可以用来简单的测试串口数据。
斑马打印机中使用ZPL打印仍然有很多东西没有弄明白,但是基本的打印效果已经满足需求了,后续还有待加强处理. 在开发吉特仓储管理系统的过程中遇到最多的也就是斑马打印机了,其实很少去使用指令来驱动打印,基本都会使用第三方的软件或者自己使用PrintDocument来实现. 本文主要记录一些斑马ZPL指令遇到的一些问题,便于以后工作中更好更快的去处理问题。
吉特仓储管理系统经过长时间的开发和修正,在后续的过程中会有更多的客户来使用,前不久编写了一份简单的文档供参考:
<<吉特仓储管理系统产品说明文档>>
吉特仓储管理系统开源地址: https://github.com/hechenqingyuan/gitwms
有仓库管理系统相关需求,或者想要了解吉特仓储管理系统的可以联系QQ 821865130 或者Q群: 88718955, 142050808
留下的问题希望明白之人指点:
(1) ZPL打印二维码支持中文
(2) 打印图片处理
作者:情缘
出处:http://www.cnblogs.com/qingyuan/
关于作者:从事仓库,生产软件方面的开发,在项目管理以及企业经营方面寻求发展之路
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
联系方式: 个人QQ 821865130 ; 仓储技术QQ群 88718955,142050808 ;
吉特仓储管理系统 开源地址: https://github.com/hechenqingyuan/gitwms
吉特仓库管理系统- 斑马打印机 ZPL语言的腐朽和神奇的更多相关文章
- 吉特仓库管理系统(开源)-如何在网页端启动WinForm 程序
在逛淘宝或者使用QQ相关的产品的时候,比如淘宝我要联系店家点击旺旺图标的时候能够自动启动阿里旺旺进行聊天.之前很奇怪为什么网页端能够自动启动客户端程序,最近在开发吉特仓储管理系统的时候也遇到一个类似的 ...
- 斑马打印机ZBL语言
ZBL手册:https://pan.baidu.com/s/1I8DaMUlf-9ytUwqtURw8rw 下面是打印CODE128条形码的代码 ^XA^FO100,100^BY6 ...
- C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)【转】
原文地址:http://blog.csdn.net/ldljlq/article/details/7338772 在批量打印商品标签时一般都要加上条码或图片,而这类应用大多是使用斑马打印机,所以我也遇 ...
- C#-利用ZPL语言完毕条形码的生成和打印
近期由于公司项目的须要,研究了一项对我来说算是新的技术-条形码的生成和打印.由于之前没有接触过这方面的知识,所以刚開始还有点小迷茫和小兴奋,只是一步一步来,问题总会解决的.如今来总结一下做条形码 ...
- 在doc下面执行zpl语言 Copy 文件名 lpt1
在doc下面执行zpl语言 Copy 文件名 lpt1 测试斑马条码打印机并口是否能正常通讯: 1.Zebra打印机安装好标签和碳带,且打印机进入Ready状态.2.电脑端用Notepad编写输入如下 ...
- ZPL语言完成条形码的打印
近期因为项目的需求,需要使用到打印机来打印业务相关的条形码和其他信息,由于之前有操作其它打印机的经验,Leader就安排我来做这个了(凑哦,这能说我是懵逼的么).于是就开始了我的探索之旅啦,不对,是踩 ...
- 斑马打印机客户端GET和POST,以及后端两种打印方式。
斑马打印机客户端GET和POST,以及后端两种打印方式. 背景环境:打印机安装在客户端外网.当用户登录时,通过ajax取服务器数据,返回打印机命令,然后客户端通过JS发送给斑马打印机. 1.使用Get ...
- 吉特仓储管理系统-ERP或WMS系统中常见术语
MPS---主生产计划(Master Production schedules) MTO---订货生产(Make-to-Order) BOM---物料清单或产品结构表(Bill of material ...
- 斑马打印机和欧姆龙CP1H串口通信打印
欧姆龙CP1HPLC和斑马打印机通信 1. PLC 1.1PLC型号 CP1H 1.2通信方式 232通信,使用232扩展卡槽CP1W-CIF01. CP1W-CIF01是RS232选件板,通信距离最 ...
随机推荐
- javascript 函数初探 (四)--- 回调函数
回调函数 既然函数与任何被赋值给变量的数据是相同的,那么她当然可以像其他数据那样被定义.删除.拷贝,以及当成参数传递给其它函数. 我们定义一个函数,这个函数有两个函数类型的参数,然后他会分别执行这两个 ...
- js 假值
function demo(a){ if(a){ console.log(111); }else{ console.log(222); } } demo(0) html_dom.html:27 222 ...
- Android 6.0 权限管理最佳实践
博客: Android 6.0 运行时权限管理最佳实践 github: https://github.com/yanzhenjie/AndPermission
- IOS开发基础知识--碎片42
1:报thread 1:exc_bad_access(code=1,address=0x70********) 闪退 这种错误通常是内存管理的问题,一般是访问了已经释放的对象导致的,可以开启僵尸对象( ...
- Android 四大组件之再论service
service常见的有2种方式,本地service以及remote service. 这2种的生命周期,同activity的通信方式等,都不相同. 关于这2种service如何使用,这里不做介绍,只是 ...
- JavaWeb工程中web.xml基本配置
一.理论准备 先说下我记得xml规则,必须有且只有一个根节点,大小写敏感,标签不嵌套,必须配对. web.xml是不是必须的呢?不是的,只要你不用到里面的配置信息就好了,不过在大型web工程下使用该文 ...
- Red Hat Enterprise Linux 6.6安装体验
Red Hat Enterprise Linux 6.6的安装首界面有五个选项,这跟以前的Red Hat Enterprise Linux 5.x的安装界面是有一些区别的. 安装或者升级现有系统( ...
- ionic入门01
总述 ionic是一个强大的混合式/hybrid HTML5移动开发框架,特点是使用标准的HTML.CSS和JavaScript,开发跨平台的应用. 接下来,敝人会从0到1采用ionic构建一个简单的 ...
- MongoDB学习笔记~Mongo集群和副本集
回到目录 一些概念 对于Mongo在数据容灾上,推荐的模式是使用副本集模式,它有一个对外的主服务器Primary,还有N个副本服务器Secondary(N>=1,当N=1时,需要有一台仲裁服务器 ...
- SQL Server自动化运维系列——监控性能指标脚本(Power Shell)
需求描述 一般在生产环境中,有时候需要自动的检测指标值状态,如果发生异常,需要提前预警的,比如发邮件告知,本篇就介绍如果通过Power shell实现状态值监控 监控值范围 根据经验,作为DBA一般需 ...