吉特仓库管理系统- 斑马打印机 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(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();
        }

    }

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(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);
        }

打印条形码(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(下载图象)执行以下功能。

    1.   置打印机为图象模式。
    2.   命名图形。(这个名字将用来在标签中调用)
    3.   定义图象尺寸
    4.   下载十六进制字符串到打印

    

    直接截图文字来说明问题了,不在废话描述,在推荐的文章中可以看到如上解释说明

 

^DGR:ZONE.GRF,4534,2443,{0},^LH0,0^FO5,60^XGR:ZONE.GRF^FS

    大抵类似如此的指令用于生成图片的打印。根据网上的算法打印图片效果并不是很好这里建议使用改文档中提到的工具生成指令代码:

http://wenku.baidu.com/link?url=BUPacTQF-XN4Yy7A0D_7BQBYXokbBGU9BsUMs0IujxLcUT0GSjj1eTGLizPpoMNp7Ssc1cdcnNsjOOucGXsbZgB7toPRxW3467z9VQ-KBOq&qq-pf-to=pcqq.c2c

 

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

 

时间: 2024-10-27 05:59:56

吉特仓库管理系统- 斑马打印机 ZPL语言的腐朽和神奇的相关文章

吉特仓库管理系统(开源)-如何在网页端启动WinForm 程序

原文:吉特仓库管理系统(开源)-如何在网页端启动WinForm 程序   在逛淘宝或者使用QQ相关的产品的时候,比如淘宝我要联系店家点击旺旺图标的时候能够自动启动阿里旺旺进行聊天.之前很奇怪为什么网页端能够自动启动客户端程序,最近在开发吉特仓储管理系统的时候也遇到一个类似的问题,因为使用网页端的打印效果并不是太好,之前也写过关于打印相关的文章可以查阅,我需要使用WinForm客户端来驱动打印,但是我又不想重新开发Winform客户端的所有功能,只要能够使用winform驱动打印即可.我就需要一个

吉特仓库管理系统-- 后台管理开源啦,源码大放送

  吉特仓储管理系统已经开发好些年了,已经不记得有多少个版本的迭代, 就针对前端UI以及项目结构等重大修改也经历了好几次.吉特仓储管理系统这个名称其实也就今年才开始使用,在此之前都已客户公司命名,基本也是针对客户定制服务. 说到底对这个项目还是有感情的,因为这个项目和很多客户建立了关系,也认识了好多朋友,一起经历了很多曾经认为一辈子也不可能经历的事情,当然因为这个项目也给我个人带来了丰厚(相对个人来说)的金钱回报,最近想了想准备开源仓储系统后台管理的源码,供有需要的朋友和同学共同学习探讨.  

吉特仓库管理系统- 基本问题解答

  吉特仓储管理系统简单版开源也有一段时间了,得到了众多的开发者和软件开发企业的咨询和青睐,在此期间也经历了版权纠纷等问题,反而到现在好像也不是版权纠纷的问题了,软件著作权这个东西本身就很难以区分, 经过上次这么一闹之后卖源代码的网站反而越来越多了,实在是令人防不慎防,由于工作也就懒得去搭理这些东西了,就跟朋友说的我这是自找难受.由于个人工作时间的问题,有些技术方面的问题实在不好一一解答,今天写一篇博文总结一下各位所问道的问题.   一. 哪里修改数据连接 这个是所有开发者中问的最多的问题,基本

吉特仓库管理系统- 可恶行径我该怎么维权--- 已经协商解决问题,此文不再公开

  工作已经累了一天了,下班之后还在想着整理吉特仓储管理系统中所遇到的打印问题,这些天写了两篇关于吉特仓储管理系统打印相关的文章,都是自己开发实施过程中遇到的实际问题想和各位分享一下.吉特仓储管理系统是本人经过多年积累开发起来的,到目前有几十家企业客户在使用中.在前不久剥离了固化的业务部分,整理出来了一个开源版本托管在了github上:https://github.com/hechenqingyuan/gitwms 供大家学习和参考.   刚准备躺下睡觉,有网友在博客中留言说自己开源的吉特仓储管

吉特仓库管理系统截图展示

                        作者:情缘 出处:http://www.cnblogs.com/qingyuan/ 关于作者:从事仓库,生产软件方面的开发,在项目管理以及企业经营方面寻求发展之路 版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接. 联系方式: 个人QQ  821865130 ; 仓储技术QQ群 88718955,142050808 ; 吉特仓储管理系统 开源地址: https://github.com

zpl-使用ZPL语言打印二维码,怎么使扫描出来的数据换行?

问题描述 使用ZPL语言打印二维码,怎么使扫描出来的数据换行? 例如我的数据为:123456789 ABCDEFHIG CODE 想要达到扫描后的效果为:123456789 ABCDEFHIG CODE 请大神帮忙,代码应该怎样写? 解决方案 问题找到方法了,加"x01"解决了. 解决方案二: 参考 New line in Zebra ZPL 使用&来还行 解决方案三: 刚才一个反斜杠被替换了,应该是使用&来换行

c# 打印机-求C#---斑马打印机打印的代码

问题描述 求C#---斑马打印机打印的代码 C#在本地代码可以调用斑马打印机进行正常打印,传到demo后在本机测试,找不到该打印机了 解决方案 是串口连接操作还是网络连接操作呢,前者检查串口号,后者检查网络试试

C#在b/s模式下调用斑马打印机,无反应,求助~~

问题描述 C#在b/s模式下调用斑马打印机,无反应,求助~~ 从网上搜得代码如下,有的说可以用,有的说报错,我的就是没有反应,斑马打印机ZT210Fnthex32.dll文件33K的和24K的都试过. 代码如下: 类:using System;using System.IO;using System.Collections.Generic;using System.Text; namespace Barcode{ /*条码打印命令说明 ^XA //条码打印指令开始 ^MD30 //设置色带颜色的

sql server-试验数据管理系统客户端用什么语言编程

问题描述 试验数据管理系统客户端用什么语言编程 单位要自己开发试验数据管理系统,后台用SQL Server2008,实现试验数据的存储.读取.对比.报表.数据曲线对比.试验流程管理以及一定的文件管理功能.希望报表和数据曲线显示功能强大些. 请问客户端用网页形式开发合适吗,用什么工具比较好,PHP.JAVAScript等吗,我对这方面是新手,以前只开发单机应用程序,见笑了. 最好能给出点建议,对比说明下优势.服务器断还需要编程吗? 解决方案 网页起始就是Web服务器,编程还是在服务端的,客户端只要