服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#通过标签软件Bartender的ZPL命令打印条码

C#通过标签软件Bartender的ZPL命令打印条码

2022-12-21 14:36痕迹g C#

这篇文章介绍了C#通过标签软件Bartender的ZPL命令打印条码,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

由于工作需要, 也是第一次接触到打印机的相关内容, 凑巧, 通过找了很多资料和帮助后, 也顺利的解决了打印标签的问题

(标签的表面信息[二维码,条形码, 文字] 和 RFID标签的EPC写入)

 

解决方案

1. 由于开发准备的前期工作, 手里面是有很多的原厂API。

C#通过标签软件Bartender的ZPL命令打印条码

2.熟之, 斑马打印机官方是由一套自己的打印语言, 简称ZPL语言, 然后各种费解找到官方的SBPL API, 大概就是这样/

C#通过标签软件Bartender的ZPL命令打印条码

通过阅读大概阅读了这些API文档(尽管看不懂...) ,大概知道原理是通过ZPL命令发送至打印机执行。

所以,顺藤摸瓜, 我直接就去搜索ZPL的操作命令, 自己尝试了编写ZPL命令操作打印机。在这里,先讲一下什么是ZPL命令~~

Zebra Programming Language (printer language) 简称ZPL是由斑马公司发明的一种用于打印机通信的命令。

3. 在ZPL API 文档种, 会用很详细的介绍, 从是怎样开始, 到各个指令的作用都会介绍, 如下图

C#通过标签软件Bartender的ZPL命令打印条码

C#通过标签软件Bartender的ZPL命令打印条码

C#通过标签软件Bartender的ZPL命令打印条码

根据官方的说明, 每个完整的ZPL 指令, 它都是 ^XA 开始, 以^Z 结束。 而^则是一个标记头, 后面跟着的字母,则是对应的作用功能, 例如:

  • ^LH : 定义标签的起始位置
  • ^LL : 定义标签的长度
  • ^PW : 打印宽度
  • ^LS : 标签的位移
  • ^......

 

实现

那么现在自己组成自己想要打印的ZPL指令, 该如何发送到打印机?

1.Demo(示例), 这里以打印一串字符 12345678 生成的ZPL指令演示如何发送到打印机

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

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

注释:
^XA/^XZ 分别代表ZPL的开始与结束, 始终固定
^FO :代表字段的起始位置, 50,50代表具体的坐标位置
^AON,36,20: 可缩放/位图字体 O代表字体, N代表字段的方向, 36代表字符的高度,20代表宽度
^FD12345678^FS: 字符内容, 代表输出的字符 12345678 标准以^FS结束
^PQ1,0,1,Y: 打印数量, 1打印数量,0暂停和切纸值,1每个序列号的副本数,Y代表覆盖暂停计数

C#通过标签软件Bartender的ZPL命令打印条码

2.核心代码( 将ZPL转换成IntPtr 然后调用 SendBytesToPrinter 方法)

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

注:  ZDesigner R110Xi4 300 dpi 是打印机的名称
        /// <summary>
      /// 内容打印
      /// </summary>
      /// <param name="szPrinterName">打印机名称</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.最终效果

C#通过标签软件Bartender的ZPL命令打印条码

 

原理

*: 看官方的API没有实际的例子不好学习和了解怎么办? 同时, 官方提供的标签设计软件(bartender)是可以将数据预先设置好,

导出本地文件的,这样更加方便学习。

1.打开已经破解版本的Bartender9.4演示如何将设计的标签导出本地文件,然后查看ZPL指令.

>1.打开Bartender9.4

C#通过标签软件Bartender的ZPL命令打印条码

>2..选择一个新的标签格式即可, 一直下一步, 直到进入主界面, 给标签添加一个文本数据: 12345678 为例

C#通过标签软件Bartender的ZPL命令打印条码

>3.然后选择打印按钮

C#通过标签软件Bartender的ZPL命令打印条码

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

C#通过标签软件Bartender的ZPL命令打印条码

>5.打开刚才保存的文件, 找到里面的内容

C#通过标签软件Bartender的ZPL命令打印条码

里面的内容, 由两个 ^XA ~ ^XZ 组成, 还有一些XML标签组成。 很明显, 第二个 ^XA-^XZ 是我们打印的实际内容指令;

>6. 像图中的 <xpml>标签 <page>标签, 这些应该是软件里面的数据格式, 肯定没用处的, 所以我们找到需要的内容即可, 然后放在测试程序里面。

C#通过标签软件Bartender的ZPL命令打印条码

C#通过标签软件Bartender的ZPL命令打印条码

注: 调用代码

        /// <summary>
      /// 测试ZPL命令执行
      /// </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;
      }

注: 由于标签纸的大小问题, 在设置标签模板的时候, 我是选定了标签的长宽, 如果出现打印不出来

或者显示不全的, 可以在标签模板设置好长宽和条码的位置即可

 

模板打印

代码贴了这么多, 可能还不知道引用了什么DLL, 指令也是刚刚接触,可能只有博主自己懂, 那还有没有更好更简单的方法实现呢?

解决方案: 《模板打印》

1.设置好打印的标签模板

工具:Bartender9.4

2.用代码给调用模板赋值

3.调用打印

Bartender

1. Bartender 官方提供的标签设计软件, 同时具体所有的打印功能。

Bartender标签软件内部原理也无非一样:1.设计好标签数据。2.打印的时候生成指令的语言发送至打印机打印。

同时Bartender也可以将设计好的样式导出模板,用于外部赋值参数打印。

友情连接:C#使用标签软件Bartender打印标签模板

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/zh7791/p/6905130.html

延伸 · 阅读

精彩推荐
  • C#C#如何读取Txt大数据并更新到数据库详解

    C#如何读取Txt大数据并更新到数据库详解

    这篇文章主要给大家介绍了关于C#如何读取Txt大数据并更新到数据库的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考...

    望着天的蜗牛9032022-08-04
  • C#.NET程序页面中,操作并输入cmd命令的小例子

    .NET程序页面中,操作并输入cmd命令的小例子

    .NET程序页面中,操作并输入cmd命令的小例子,需要的朋友可以参考一下...

    C#教程网1982020-12-18
  • C#C#通过GET/POST方式发送Http请求

    C#通过GET/POST方式发送Http请求

    本文主要介绍了C#实现http请求的两种方式,get和post方式。文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    mrli1134522022-12-02
  • C#C#在foreach遍历删除集合中元素的三种实现方法

    C#在foreach遍历删除集合中元素的三种实现方法

    这篇文章主要给大家总结介绍了关于C#在foreach遍历删除集合中元素的实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考...

    willingtolove8842022-08-11
  • C#C# SMTP发送邮件的示例

    C# SMTP发送邮件的示例

    这篇文章主要介绍了C# SMTP发送邮件的示例,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...

    Bruce-6122022-10-19
  • C#C# 读取ttf字体文件里的Unicode实现

    C# 读取ttf字体文件里的Unicode实现

    这篇文章主要介绍了C# 读取 ttf字体文件里的 Unicode实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    超蓝微猫10362022-10-09
  • C#C#实现百度ping推送功能的方法

    C#实现百度ping推送功能的方法

    百度ping是网站优化必做的事情,这样才能主动推送给百度,那么基于代码是如何实现百度推送方法呢?下文小编给大家带来了C#实现百度ping推送功能的方法...

    1823699221211442021-12-02
  • C#3种方法实现WindowsForm切换窗口

    3种方法实现WindowsForm切换窗口

    这篇文章主要介绍了3种方法实现WindowsForm切换窗口,文中讲解非常详细,示例代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    zhuanghamiao9902022-09-21