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

注:

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

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

解决方案

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

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

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

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

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

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

根据官方的说明, 每个完整的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代表覆盖暂停计数

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.最终效果

原理

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

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

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

>1.打开Bartender9.4

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

>3.然后选择打印按钮

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

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

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

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

注: 调用代码

        /// <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打印标签模板

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

(0)

相关推荐

  • C#条码生成类分享

    本文实例为大家分享了C#条码生成类的具体代码,供大家参考,具体内容如下 using System.Collections; using System.Text.RegularExpressions; namespace DotNet.Utilities { public class BarCodeToHTML { public static string get39(string s, int width, int height) { Hashtable ht = new Hashtable()

  • asp.net(C#)生成Code39条形码实例 条码枪可以扫描出

    复制代码 代码如下: using System;using System.Collections;using System.ComponentModel;using System.Drawing;using System.Data; namespace MSCL{    /// <summary>    /// 生成条码Code39    /// </summary>    public class Code39    {      private Hashtable m_Code

  • C#实现的ZPL条码打印类完整实例

    本文实例讲述了C#实现的ZPL条码打印类.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; using System.Runtime.InteropS

  • C#条码生成及打印实例代码

    本文实例为大家分享了C#条码生成及打印的方法,供大家参考,具体内容如下 string BarcodeString = "13043404455";//条码 int ImgWidth = 520; int ImgHeight = 120; //打印按钮 private void button1_Click(object sender, EventArgs e) { //实例化打印对象 PrintDocument printDocument1 = new PrintDocument();

  • C#/VB.NET 在Word中添加条码、二维码的示例代码

    本文介绍如何通过C# 和VB.NET代码实现在Word文档中添加条码和二维码.代码中将分为在Word正文段落中.页眉页脚中等情况来添加. 使用工具: Free Spire.Office for .NET (免费版) 工具简介: 这是Spire所有.NET平台下免费产品的集合包,包含Spire.Barcode.dll.Spire.DataExport.dll.Spire.Pdf.dll.Spire.Doc.dll.Spire.DocViewer.Forms.dll .Spire.PdfViewer

  • C#使用标签软件Bartender打印标签模板

    在之前写的一篇文章中, 有讲到如何利用ZPL命令去操作打印里, 后面发现通过模板的方式会更加方便快捷, 既不用去掌握ZPL的实现细节, 就可以轻松的调用实现打印的功能. 解决方案: 1.网络下载破解版的Bartender 标签软件. 2.利用C#的控制台程序, 桌面程序做测试. 在这里就不讲如何下载Bartender软件了, 直接步入正题, 打开已经下载好的Bartender软件, 设置一个标签模板. 1.先拖拽一个条码标签到主界面, 然后右键其属性设置为二维码格式(测试) 2.尝试拉几个文本标

  • ASP.net(c#)生成条形码 code39条码生成方法

    这几天一直在弄128条码的事情,找了相关的资料,也没找到.后来没办法只能改成code39的条码.现在把它写出来,与大家分享 1.先下载一种免费的 code39条码字体 2.建个类 为 code39 并写入以下代码 复制代码 代码如下: public sealed class Code39 { #region private variables /// <summary> /// The Space Between each of Title, BarCode, BarCodeString //

  • .NET C#支付宝条码支付接口详解

    支付宝条码支付接口使用,供大家参考,具体内容如下 应用场景实例 收银员使用扫码设备读取用户支付宝钱包"付款码"后,将二维码或条码信息通过本接口上送至支付宝发起支付. SDK下载 支付宝提供3种开发语言的SDK,选择自己的开发语言下载,项目中会有很多示例.本文选择.NET2010版本. 将SDK项目中的AopSdk.dll文件引用到自己的项目中. 支付类代码 简略版 数据需自行获取 public class ToAlipayBLL { private static readonly To

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

    注: 由于工作需要, 也是第一次接触到打印机的相关内容, 凑巧, 通过找了很多资料和帮助后, 也顺利的解决了打印标签的问题 (标签的表面信息[二维码,条形码, 文字] 和 RFID标签的EPC写入) 解决方案 1. 由于开发准备的前期工作, 手里面是有很多的原厂API. 2.熟之, 斑马打印机官方是由一套自己的打印语言, 简称ZPL语言, 然后各种费解找到官方的SBPL API, 大概就是这样/ 通过阅读大概阅读了这些API文档(尽管看不懂...) ,大概知道原理是通过ZPL命令发送至打印机执行

  • 对linux下软件(库)的更新命令详解

    在ubuntu服务器下安装包的时候,经常会用到sudo apt-get install 包名 或 sudo pip install 包名,那么两者有什么区别呢? 1.区别 pip用来安装来自PyPI(https://www.python.org/)的python所有的依赖包,并且可以选择安装任何在PyPI上已上传的先前版本的依赖包,个人认为是python相关的包和第三方包以及各种版本: apt-get可以用来安装软件.更新源.也可以用来更新自Ubuntu(https://launchpad.ne

  • Python深度学习之图像标签标注软件labelme详解

    前言 labelme是一个非常好用的免费的标注软件,博主看了很多其他的博客,有的直接是翻译稿,有的不全面.对于新手入门还是有点困难.因此,本文的主要是详细介绍labelme该如何使用. 一.labelme是什么? labelme是图形图像注释工具,它是用Python编写的,并将Qt用于其图形界面.说直白点,它是有界面的, 像软件一样,可以交互,但是它又是由命令行启动的,比软件的使用稍微麻烦点.其界面如下图: 它的功能很多,包括: 对图像进行多边形,矩形,圆形,多段线,线段,点形式的标注(可用于目

  • Perl命令行应用程序详解

    perl - Practical Extraction and Report Language,Perl有很多命令行参数,通过它可以让你的程序更简练,并且可以写出很多只有一行命令的perl.在这篇文章里我们来了解一些常用的命令行参数. 命令行调用 复制代码 代码如下: perl [ -sTtuUWX ] [ -hv ] [ -V[:configvar] ] [ -cw ] [ -d[t][:debugger] ] [ -D[number/list] ] [ -pna ] [ -Fpattern

  • BAT批处理实现软件的自动安装(以搜狗拼音为例)

    下面以安装搜狗拼音为例做个小实验,其他软件的安装可以以此作为参考来实现. 实验目标: 使用批处理实现搜狗拼音的自动安装 实验步骤: 1.下载搜狗拼音的安装包,本实验使用sogou_pinyin_50a.exe. 2.在安装包所在目录下新建批处理文件sogou_install.bat. 3.编辑批处理文件sogou_install.bat,输入以下命令并保存. 复制代码 代码如下: start /wait .\sogou_pinyin_50a.exe /S 4.双击批处理文件执行之. 5.要是以管

  • git标签管理_动力节点Java学院整理

    发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一个快照. Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的. Git有commit,为什么还要引入tag? "请把上周一的那个版本打包发布,commit号是6a5819e..." &qu

  • linux 下的yum命令详解

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载.安装.yum提供了查找.安装.删除某一个.一组甚至全部软件包的命令,而且命令简洁而又好记. yum的命令形式一般是如下:yum [options] [command] [package ...] 其中的[opt

  • 使用批处理实现软件的自动安装以安装搜狗拼音为例

    下面以安装搜狗拼音为例做个小实验,其他软件的安装可以以此作为参考来实现. 实验目标: 使用批处理实现搜狗拼音的自动安装 实验步骤: 1.下载搜狗拼音的安装包,本实验使用sogou_pinyin_50a.exe. 2.在安装包所在目录下新建批处理文件sogou_install.bat. 3.编辑批处理文件sogou_install.bat,输入以下命令并保存. [plain] start /wait .\sogou_pinyin_50a.exe /S 4.双击批处理文件执行之. 5.要是以管理员身

随机推荐