上一篇文章说到了.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(21 * 1024); int count = ZplPrintControl.GETFONTHEX(ChineseText, FontName, Orient, Height, Width, IsBold, IsItalic, hexbuf); if (count > 0) { 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(); } }
以上代码缺少打印图片部分的代码,这个在后续单独讲解为什么
中文打印有点特殊,斑马打印机本身对中文支持性不好,这里我们需要使用到动态链接库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(21 * 1024); int count = ZplPrintControl.GETFONTHEX(ChineseText, FontName, Orient, Height, Width, IsBold, IsItalic, hexbuf); if (count > 0) { 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); }
/// <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,4534,2443,{0},^LH0,0^FO5,60^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 = 9600; 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