欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#通過標(biāo)簽軟件Bartender的ZPL命令打印條碼

 更新時(shí)間:2022年01月24日 11:01:43   作者:痕跡g  
這篇文章介紹了C#通過標(biāo)簽軟件Bartender的ZPL命令打印條碼,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

注:

由于工作需要, 也是第一次接觸到打印機(jī)的相關(guān)內(nèi)容, 湊巧, 通過找了很多資料和幫助后, 也順利的解決了打印標(biāo)簽的問題

(標(biāo)簽的表面信息[二維碼,條形碼, 文字] 和 RFID標(biāo)簽的EPC寫入)

解決方案

1. 由于開發(fā)準(zhǔn)備的前期工作, 手里面是有很多的原廠API。

2.熟之, 斑馬打印機(jī)官方是由一套自己的打印語言, 簡稱ZPL語言, 然后各種費(fèi)解找到官方的SBPL API, 大概就是這樣/

通過閱讀大概閱讀了這些API文檔(盡管看不懂...) ,大概知道原理是通過ZPL命令發(fā)送至打印機(jī)執(zhí)行。

所以,順藤摸瓜, 我直接就去搜索ZPL的操作命令, 自己嘗試了編寫ZPL命令操作打印機(jī)。在這里,先講一下什么是ZPL命令~~

Zebra Programming Language (printer language) 簡稱ZPL是由斑馬公司發(fā)明的一種用于打印機(jī)通信的命令。

3. 在ZPL API 文檔種, 會(huì)用很詳細(xì)的介紹, 從是怎樣開始, 到各個(gè)指令的作用都會(huì)介紹, 如下圖

根據(jù)官方的說明, 每個(gè)完整的ZPL 指令, 它都是 ^XA 開始, 以^Z 結(jié)束。 而^則是一個(gè)標(biāo)記頭, 后面跟著的字母,則是對(duì)應(yīng)的作用功能, 例如:

  • ^LH : 定義標(biāo)簽的起始位置
  • ^LL : 定義標(biāo)簽的長度
  • ^PW : 打印寬度
  • ^LS : 標(biāo)簽的位移
  • ^......

實(shí)現(xiàn)

那么現(xiàn)在自己組成自己想要打印的ZPL指令, 該如何發(fā)送到打印機(jī)?

1.Demo(示例), 這里以打印一串字符 12345678 生成的ZPL指令演示如何發(fā)送到打印機(jī)

* 12345678所生成的ZPL指令如下: 

^ XA
^ FO50,50
^ A0N,36,20
^ FD12345678 ^ FS
^ PQ1,0,1,Y
^ XZ

注釋:
^XA/^XZ 分別代表ZPL的開始與結(jié)束, 始終固定
^FO :代表字段的起始位置, 50,50代表具體的坐標(biāo)位置
^AON,36,20: 可縮放/位圖字體 O代表字體, N代表字段的方向, 36代表字符的高度,20代表寬度
^FD12345678^FS: 字符內(nèi)容, 代表輸出的字符 12345678 標(biāo)準(zhǔn)以^FS結(jié)束
^PQ1,0,1,Y: 打印數(shù)量, 1打印數(shù)量,0暫停和切紙值,1每個(gè)序列號(hào)的副本數(shù),Y代表覆蓋暫停計(jì)數(shù)

2.核心代碼( 將ZPL轉(zhuǎn)換成IntPtr 然后調(diào)用 SendBytesToPrinter 方法)

//ZPL命令測試方法
        public bool PrintZPL(string zpl)
        {
            return SendStringToPrinter("ZDesigner R110Xi4 300 dpi", zpl);
        }

  注:  ZDesigner R110Xi4 300 dpi 是打印機(jī)的名稱
        /// <summary>
        /// 內(nèi)容打印
        /// </summary>
        /// <param name="szPrinterName">打印機(jī)名稱</param>
        /// <param name="szString">打印的SBPL指令</param>
        /// <returns></returns>
        public bool SendStringToPrinter(string szPrinterName, string szString)
        {
            IntPtr pBytes;
            int dwCount;
            dwCount = szString.Length;
            pBytes = Marshal.StringToCoTaskMemAnsi(szString);
            SendBytesToPrinter(szPrinterName, pBytes, dwCount);
            Marshal.FreeCoTaskMem(pBytes);
            return true;
        }
        // Structure and API declarions:
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public class DOCINFOA
        {
            [MarshalAs(UnmanagedType.LPStr)]
            public string pDocName;
            [MarshalAs(UnmanagedType.LPStr)]
            public string pOutputFile;
            [MarshalAs(UnmanagedType.LPStr)]
            public string pDataType;
        }
        [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, int pd);

        [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool ClosePrinter(IntPtr hPrinter);

        [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);

        [DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool EndDocPrinter(IntPtr hPrinter);

        [DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool StartPagePrinter(IntPtr hPrinter);

        [DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool EndPagePrinter(IntPtr hPrinter);

        [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);

        public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
        {
            Int32 dwError = 0, dwWritten = 0;
            IntPtr hPrinter = new IntPtr(0);
            DOCINFOA di = new DOCINFOA();
            bool bSuccess = false; // Assume failure unless you specifically succeed.

            di.pDocName = "labelprint";
            di.pDataType = "RAW";

            // Open the printer.
            if (OpenPrinter(szPrinterName, out hPrinter, 0))
            {
                // Start a document.
                if (StartDocPrinter(hPrinter, 1, di))
                {
                    // Start a page.
                    if (StartPagePrinter(hPrinter))
                    {
                        // Write your bytes.
                        bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                        EndPagePrinter(hPrinter);
                    }
                    EndDocPrinter(hPrinter);
                }
                ClosePrinter(hPrinter);
            }
            // If you did not succeed, GetLastError may give more information
            // about why not.
            if (bSuccess == false)
            {
                dwError = Marshal.GetLastWin32Error();
            }
            return bSuccess;
        }

3.最終效果

原理

*: 看官方的API沒有實(shí)際的例子不好學(xué)習(xí)和了解怎么辦? 同時(shí), 官方提供的標(biāo)簽設(shè)計(jì)軟件(bartender)是可以將數(shù)據(jù)預(yù)先設(shè)置好,

導(dǎo)出本地文件的,這樣更加方便學(xué)習(xí)。

1.打開已經(jīng)破解版本的Bartender9.4演示如何將設(shè)計(jì)的標(biāo)簽導(dǎo)出本地文件,然后查看ZPL指令.

>1.打開Bartender9.4

>2..選擇一個(gè)新的標(biāo)簽格式即可, 一直下一步, 直到進(jìn)入主界面, 給標(biāo)簽添加一個(gè)文本數(shù)據(jù): 12345678 為例

>3.然后選擇打印按鈕

>4.勾選打印至文件, 保存至本地文件。

>5.打開剛才保存的文件, 找到里面的內(nèi)容

里面的內(nèi)容, 由兩個(gè) ^XA ~ ^XZ 組成, 還有一些XML標(biāo)簽組成。 很明顯, 第二個(gè) ^XA-^XZ 是我們打印的實(shí)際內(nèi)容指令;

>6. 像圖中的 <xpml>標(biāo)簽 <page>標(biāo)簽, 這些應(yīng)該是軟件里面的數(shù)據(jù)格式, 肯定沒用處的, 所以我們找到需要的內(nèi)容即可, 然后放在測試程序里面。

注: 調(diào)用代碼

        /// <summary>
        /// 測試ZPL命令執(zhí)行
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_print_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txt_zpl.Text)) return;

            SendStringToPrinte("ZDesigner R110Xi4 300 dpi",txt_zpl.Text); 
        }
        public static bool SendStringToPrinter(string szPrinterName, string szString)
        {
            IntPtr pBytes;
            Int32 dwCount;
            dwCount = szString.Length;
            pBytes = Marshal.StringToCoTaskMemAnsi(szString);
            SendBytesToPrinter(szPrinterName, pBytes, dwCount);
            Marshal.FreeCoTaskMem(pBytes);
            return true;
        }

注: 由于標(biāo)簽紙的大小問題, 在設(shè)置標(biāo)簽?zāi)0宓臅r(shí)候, 我是選定了標(biāo)簽的長寬, 如果出現(xiàn)打印不出來

或者顯示不全的, 可以在標(biāo)簽?zāi)0逶O(shè)置好長寬和條碼的位置即可

模板打印

代碼貼了這么多, 可能還不知道引用了什么DLL, 指令也是剛剛接觸,可能只有博主自己懂, 那還有沒有更好更簡單的方法實(shí)現(xiàn)呢?

解決方案: 《模板打印》

1.設(shè)置好打印的標(biāo)簽?zāi)0?/p>

工具:Bartender9.4

2.用代碼給調(diào)用模板賦值

3.調(diào)用打印

Bartender

1. Bartender 官方提供的標(biāo)簽設(shè)計(jì)軟件, 同時(shí)具體所有的打印功能。

Bartender標(biāo)簽軟件內(nèi)部原理也無非一樣:1.設(shè)計(jì)好標(biāo)簽數(shù)據(jù)。2.打印的時(shí)候生成指令的語言發(fā)送至打印機(jī)打印。

同時(shí)Bartender也可以將設(shè)計(jì)好的樣式導(dǎo)出模板,用于外部賦值參數(shù)打印。

友情連接:C#使用標(biāo)簽軟件Bartender打印標(biāo)簽?zāi)0?/a>

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于WPF簡單實(shí)現(xiàn)Meesage消息提醒

    基于WPF簡單實(shí)現(xiàn)Meesage消息提醒

    這篇文章主要介紹了如何利用WPF簡單實(shí)現(xiàn)Meesage消息提醒,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下
    2023-07-07
  • VS2019配置OpenCV4.1.0詳細(xì)教程與測試代碼(推薦)

    VS2019配置OpenCV4.1.0詳細(xì)教程與測試代碼(推薦)

    這篇文章主要介紹了VS2019配置OpenCV4.1.0詳細(xì)教程與測試代碼,本文通過截圖實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C#讀寫INI文件的方法

    C#讀寫INI文件的方法

    這篇文章主要介紹了C#讀寫INI文件的方法,涉及C#讀寫ini文件的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • C#通過DataSet讀寫xml文件的方法

    C#通過DataSet讀寫xml文件的方法

    這篇文章主要介紹了C#通過DataSet讀寫xml文件的方法,涉及C#使用DataSet操作XML的相關(guān)技巧,方法簡單實(shí)用,需要的朋友可以參考下
    2015-05-05
  • unity自帶尋路(導(dǎo)航)系統(tǒng) Nav Mesh導(dǎo)航網(wǎng)格

    unity自帶尋路(導(dǎo)航)系統(tǒng) Nav Mesh導(dǎo)航網(wǎng)格

    這篇文章主要為大家詳細(xì)介紹了unity自帶尋路(導(dǎo)航)系統(tǒng),Nav Mesh導(dǎo)航網(wǎng)格,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C#實(shí)現(xiàn)圖片切割的方法

    C#實(shí)現(xiàn)圖片切割的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)圖片切割的方法,涉及C#使用Graphics實(shí)現(xiàn)圖片屬性的相關(guān)設(shè)置、保存等操作技巧,需要的朋友可以參考下
    2017-06-06
  • 淺析C#中結(jié)構(gòu)與類的區(qū)別

    淺析C#中結(jié)構(gòu)與類的區(qū)別

    本文主要對(duì)C#結(jié)構(gòu)與類的區(qū)別進(jìn)行簡要分析,文中舉了實(shí)例,便于理解,具有很好的參考價(jià)值,需要的朋友一起來看下吧
    2016-12-12
  • C#非矩形窗體實(shí)現(xiàn)方法

    C#非矩形窗體實(shí)現(xiàn)方法

    這篇文章主要介紹了C#非矩形窗體實(shí)現(xiàn)方法,涉及C#窗體操作的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • C#/VB.NET實(shí)現(xiàn)在 Word 中插入水印?

    C#/VB.NET實(shí)現(xiàn)在 Word 中插入水印?

    這篇文章主要介紹了C#/VB.NET實(shí)現(xiàn)在 Word 中插入水印,水印是指在 Word 文檔的背景中以淡色或灰色顯示的文本或圖像。文章圍繞主題展開介紹,需要的朋友可以參考一下
    2022-08-08
  • C#實(shí)現(xiàn)語音播報(bào)功能的示例詳解

    C#實(shí)現(xiàn)語音播報(bào)功能的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)語音播報(bào)功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下
    2024-02-02

最新評(píng)論