C直接发送打印机命令到打印机及ZPL常用打印命令 – 条码打印机

C直接发送打印机命令到打印机及ZPL常用打印命令 – 条码打印机usingSystem usingSystem Collections Generic usingSystem Text usingSystem Runtime InteropServi namespaceBar publicclassZ StructLayout LayoutKi

using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace BarCodeLibrary { public class ZebraGesigner { [StructLayout(LayoutKind.Sequential)] private struct OVERLAPPED { int Internal; int InternalHigh; int Offset; int OffSetHigh; int hEvent; } [DllImport("kernel32.dll")] private static extern int CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile); [DllImport("kernel32.dll")] private static extern bool WriteFile(int hFile, byte[] lpBuffer, int nNumberOfBytesToWriter, out int lpNumberOfBytesWriten, out OVERLAPPED lpOverLapped); [DllImport("kernel32.dll")] private static extern bool CloseHandle(int hObject); [DllImport("fnthex32.dll")] public static extern int GETFONTHEX(string barcodeText,string fontName,int orient,int height,int width,int isBold,int isItalic,StringBuilder returnBarcodeCMD); private int iHandle; //打开LPT 端口 public bool Open() { iHandle = CreateFile("lpt1", 0x, 0, 0, 3, 0, 0); if (iHandle != -1) { return true; } else { return false; } } //打印函数,参数为打印机的命令或者其他文本! public bool Write(string MyString) { if (iHandle != -1) { int i; OVERLAPPED x; byte[] mybyte = System.Text.Encoding.Default.GetBytes(MyString); return WriteFile(iHandle, mybyte, mybyte.Length, out i, out x); } else { throw new Exception("端口未打开~!"); } }      //关闭打印端口 public bool Close() { return CloseHandle(iHandle); } } }
vate void button1_Click(object sender, EventArgs e) { ZebraGesigner zb = new ZebraGesigner(); string mycommanglines = System.IO.File.ReadAllText("print.txt");//print.txt里写了条码机的命令 zb.Open(); zb.Write(mycommanglines); zb.Close(); }
/* ^XA ^XA指令块的开始 ^MD30 ^MD是设置色带颜色的深度,取值范围从-30到30,上面的示意指令将颜色调到了最深. ^LH60,10 ^LH是设置条码纸的边距的,这个东西在实际操作上来回试几次即可. ^FO20,10 ^FO是设置条码左上角的位置的,这个对程序员应该很容易理解. 0,0代表完全不留边距. ^ACN,18,10 ^ACN是设置字体的.因为在条码下方会显示该条码的内容,所以要设一下字体.这个跟条码无关. ^BY1.4,3,50 ^BY是设置条码样式的,1.4是条码的缩放级别,3是条码中粗细柱的比例,50是条码高度. ^BCN,,Y,N ^BC是打印code128的指令,具体参数详见ZPL的说明书(百度云盘) ^FD01008D004Q-0^FS ^FD设置要打印的内容, ^FS表示换行. ^XZ ^XZ指令块的开始 */ StringBuilder builder = new StringBuilder(); builder.AppendLine("^XA"); builder.AppendLine("^MD30"); builder.AppendLine("^LH60,10"); builder.AppendLine("^FO20,10"); builder.AppendLine("^ACN,18,10"); builder.AppendLine("^BY1.4,3,50"); builder.AppendLine("^BCN,,Y,N"); builder.AppendLine("^FD01008D004Q-0^FS"); builder.AppendLine("^XZ");
在实践中, 常常会需要一次横打两张, 其实可以把一排的两张想像成一张, 连续执行两个打印命令, 把第二个FO的横坐标设置得大一些就行了. 例如: ^XA  ^FO20,10 ^FD001^FS  ^FO60,10 ^FD002^FS  ^XZ 第一对FO/FD命令打印左侧, 第二对FO/FD命令打印右侧.  例如: ^XA  ^FO20,10 ^FD001^FS  ^FO60,10 ^FD002^FS  ^XZ 第一对FO/FD命令打印左侧, 第二对FO/FD命令打印右侧. 
  
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Drawing; using System.Drawing.Printing; using System.Windows.Forms; using System.Runtime.InteropServices; namespace ZPLPrinter { class RawPrinterHelper { // 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, IntPtr 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); // SendBytesToPrinter() // When the function is given a printer name and an unmanaged array // of bytes, the function sends those bytes to the print queue. // Returns true on success, false on failure. 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 = "My C#.NET RAW Document"; di.pDataType = "RAW"; // Open the printer. if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero)) { // 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; } public static bool SendFileToPrinter(string szPrinterName, string szFileName) { // Open the file. FileStream fs = new FileStream(szFileName, FileMode.Open); // Create a BinaryReader on the file. BinaryReader br = new BinaryReader(fs); // Dim an array of bytes big enough to hold the file's contents. Byte[] bytes = new Byte[fs.Length]; bool bSuccess = false; // Your unmanaged pointer. IntPtr pUnmanagedBytes = new IntPtr(0); int nLength; nLength = Convert.ToInt32(fs.Length); // Read the contents of the file into the array. bytes = br.ReadBytes(nLength); // Allocate some unmanaged memory for those bytes. pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength); // Copy the managed byte array into the unmanaged array. Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength); // Send the unmanaged bytes to the printer. bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength); // Free the unmanaged memory that you allocated earlier. Marshal.FreeCoTaskMem(pUnmanagedBytes); return bSuccess; } public static bool SendStringToPrinter(string szPrinterName, string szString) { IntPtr pBytes; Int32 dwCount; // How many characters are in the string? dwCount = szString.Length; // Assume that the printer is expecting ANSI text, and then convert // the string to ANSI text. pBytes = Marshal.StringToCoTaskMemAnsi(szString); // Send the converted ANSI string to the printer. SendBytesToPrinter(szPrinterName, pBytes, dwCount); Marshal.FreeCoTaskMem(pBytes); return true; } } }
 public string Print(string stuNo, string liuBookNo, string suoBookNum, string stuName) { if (string.IsNullOrEmpty(liuBookNo) || string.IsNullOrEmpty(suoBookNum)) { return "参数错误,打印失败!"; } StringBuilder tiaomaStr = new StringBuilder(); tiaomaStr.AppendLine(); tiaomaStr.AppendLine("N"); tiaomaStr.AppendLine("B0,10,0,1,2,3,100,B,$" + suoBookNum + "$"); tiaomaStr.AppendLine("A2050,10,5,9,1,1,N,$" + liuBookNo + "$"); tiaomaStr.AppendLine("A0,160,0,8,1,1,N,$未知$"); tiaomaStr.AppendLine("A0,210,0,8,1,1,N,$捐书人:" + stuName + "$"); tiaomaStr.AppendLine("D15"); tiaomaStr.AppendLine("P1"); FileStream fs = null; try { string path = Server.MapPath("~/BooksManagement\\File\\tiaoma.txt"); fs = new FileStream(path, FileMode.Create, FileAccess.Write); StreamWriter sw = new StreamWriter(fs, Encoding.Default);//ANSI编码格式 if (File.Exists(path)) { sw.Write(tiaomaStr.ToString().Replace('$', '"')); tiaomaStr.Clear(); sw.Flush(); sw.Close(); if (RunCmd("COPY " + path + " LPT1")) return string.Empty; else return "参数错误,打印失败!"; } } catch { } finally { fs.Close(); } return "参数错误,打印失败!"; } private bool RunCmd(string command) { //实例一个Process类,启动一个独立进程 Process p = new Process(); //Process类有一个StartInfo属性,這個是ProcessStartInfo类,包括了一些属性和方法,下面我們用到了他的几个属性: p.StartInfo.FileName = "cmd.exe";//设定程序名 p.StartInfo.Arguments = "/c " + command;//设定程式执行参数 p.StartInfo.UseShellExecute = false;//关闭Shell的使用 p.StartInfo.RedirectStandardInput = true;//重定向标准输入 p.StartInfo.RedirectStandardOutput = true;//重定向标准输出 p.StartInfo.RedirectStandardError = true;//重定向错误输出 p.StartInfo.CreateNoWindow = true;//设置不显示窗口 //p.StandardInput.WriteLine(command);//也可以用这种方式输入要执行的命令 //p.StandardInput.WriteLine("exit");//不过要记得加上Exit要不然下一行程式执行的時候会当机 try { p.Start();//开始进程 return true; } catch { } finally { if (p != null) p.Close(); } return false; }
 /* 中文或其它复杂设计成图片,然后用ZPL命令发送给条码打印机打印 //定义字体 Font drawFont = new Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Millimeter); //生成图片 Bitmap img = CreateImage("出厂日期:" + DateTime.Now, drawFont); var imgCode = ConvertImageToCode(img); var t = ((img.Size.Width / 8 + ((img.Size.Width % 8 == 0) ? 0 : 1)) * img.Size.Height).ToString(); //图形中的总字节数 var w = (img.Size.Width / 8 + ((img.Size.Width % 8 == 0) ? 0 : 1)).ToString(); //每行的字节数 string zpl = string.Format("~DGR:imgName.GRF,{0},{1},{2}", t, w, imgCode); //发送给打印机 */ /// <summary> /// 生成Bitmap /// </summary> /// <param name="data">字符串</param> /// <param name="f">文本格式</param> /// <returns></returns> protected Bitmap CreateImage(string data, Font f) { if (string.IsNullOrEmpty(data)) return null; var txt = new TextBox(); txt.Text = data; txt.Font = f; //txt.PreferredSize.Height只能取到一行的高度(连边距) //所以需要乘以行数, 但是必须先减掉边距, 乘了以后,再把边距加上. //5是目测的边距 var image = new Bitmap(txt.PreferredSize.Width, (txt.PreferredSize.Height - 5) * txt.Lines.Length + 5); var g = Graphics.FromImage(image); var b = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Black, Color.Black, 1.2f, true); g.Clear(System.Drawing.Color.White); g.DrawString(data, f, b, 1, 1); return image; } /// <summary> /// 序列化图片 /// </summary> /// <param name="img">Bitmap</param> /// <returns></returns> protected string ConvertImageToCode(Bitmap img) { var sb = new StringBuilder(); long clr = 0, n = 0; int b = 0; for (int i = 0; i < img.Size.Height; i++) { for (int j = 0; j < img.Size.Width; j++) { b = b * 2; clr = img.GetPixel(j, i).ToArgb(); string s = clr.ToString("X"); if (s.Substring(s.Length - 6, 6).CompareTo("BBBBBB") < 0) { b++; } n++; if (j == (img.Size.Width - 1)) { if (n < 8) { b = b * (2 ^ (8 - (int)n)); sb.Append(b.ToString("X").PadLeft(2, '0')); b = 0; n = 0; } } if (n >= 8) { sb.Append(b.ToString("X").PadLeft(2, '0')); b = 0; n = 0; } } sb.Append(System.Environment.NewLine); } return sb.ToString(); } 

MSCL超级工具类库
基于C#开发的超强工具类,包含数据库操作,字符串处理,文件或者文件夹处理
网络请求,缓存处理,数据容器等上百个常用工具类封装,附带调用示例和参数说明,
提供CHM详细文档,上百个生产环境使用,稳定高效,简单易用。
真正做到“工具在手,一切尽有”,让你大幅度的提高编程效率,提高编程水平。
联系:(请备注 “MSCL”)




C直接发送打印机命令到打印机及ZPL常用打印命令 - 条码打印机

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232546.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 布隆过滤器原理及应用场景分析_布隆过滤器 数据更新怎么办

    布隆过滤器原理及应用场景分析_布隆过滤器 数据更新怎么办https://www.cnblogs.com/qdhxhz/p/11237246.html开发一个电商项目,因为数据量一直在增加(已达亿级),所以需要重构之前开发好的秒杀功能,为了更好的支持高并发,在验证用户是否重复购买的环节,就考虑用布隆过滤器。也顺便更加深入的去了解下布隆过滤器的原理,感觉还是蛮有意思的,这一连串的公式不静下心来思考,很容易被绕晕。一、概述1、什么是布隆过滤器本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构,特点是高效地插入和查询。根据查询结果可以用来告

    2022年10月6日
    3
  • 有计算机二级python证书可以做什么工作_python有证书考吗

    有计算机二级python证书可以做什么工作_python有证书考吗python以什么方式处理文件?很多同学想考python的证书,想知道Python有哪些含金量高的证书?一、全国计算机等级考试Python程序语言设计;二、PythonInstitute资格认证初级PCEP;三、PythonInstitute资格认证初级PCEP中级PCAP;四、PythonInstitute资格认证初级PCEP高级PCPP;五、工信部Python技术应用工程。毕业前最好都拿到手的证书,用处大!专业证书对于就读不同大学专业的同学而言,需要考取跟自己专业挂钩的专业证书,不相关的.

    2025年9月26日
    4
  • 绕过问题也是一种能力–记一次接口的问题「建议收藏」

    绕过问题也是一种能力–记一次接口的问题

    2022年1月19日
    82
  • Android Settings开发之修改

    Android Settings开发之修改版本:1.0 日期:2014.3.20 2014.3.25  版权:©2014kince转载注明出处        下面是Seeings应用的截图:  可以看出这是很典型的使用了Fragment后的界面,设置里面有WIFI、蓝牙、显示、存储、应用等众多功能。左边的每一项,对应着右边的一个设置界面,Fragment有四个子类:DialogFragment,ListFragme

    2025年5月25日
    2
  • 几个函数泰勒展开式及其记忆技巧

    几个函数泰勒展开式及其记忆技巧几个函数泰勒展开式及其记忆技巧 nbsp nbsp

    2025年10月11日
    4
  • Kotlin学习之路(2)数据类型

    Kotlin学习之路(2)数据类型

    2021年3月12日
    153

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号