吉特倉庫管理系統- 斑馬打印機 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM