吉特倉庫管理系統- 斑馬印表機 ZPL語言的腐朽和神奇

賀臣發表於2016-07-19

 

  上一篇文章說到了.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

 

相關文章