关于使用条码打印机指令打印汉字的问题
最近公司做项目,用到条码,对于打印机来说很简单的啦,直接编辑文本输出不就可以打印了吗,是的,但是有时候,要打印的内容是动态的,需要制作条码的软件来完成有点不切实际。大多数的条码打印机是不支持用指令直接打印汉字的。
网上找了好多,唯一可行的就是调用第三方dll来完成,这样把要打印的汉字根据第三方的dll进行转换,得到了条码打印机ZPL自己识别的语言。就可行了。
我用的是斑马GK888T打印机。fnthex32.dll
[DllImport("fnthex32.dll")]public static extern int GETFONTHEX(string BarcodeText,string FontName,string FileName,int Orient,int Height,int Width,int IsBold,int IsItalic,StringBuilder ReturnBarcodeCMD);
有个类BarcodePrint
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;namespace Barcode
{class BarcodePrint{[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]private struct OVERLAPPED{int Internal;int InternalHigh;int Offset;int OffSetHigh;int hEvent;}[System.Runtime.InteropServices.DllImport("kernel32.dll")]private static extern int CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);[System.Runtime.InteropServices.DllImport("kernel32.dll")]private static extern bool WriteFile(int hFile, byte[] lpBuffer, int nNumberOfBytesToWrite, out int lpNumberOfBytesWritten, out OVERLAPPED lpOverlapped);[System.Runtime.InteropServices.DllImport("kernel32.dll")]private static extern bool CloseHandle(int hObject);private int iHandle;public bool Open(){iHandle = CreateFile("LPT1:", (uint)FileAccess.ReadWrite, 0, 0, (int)FileMode.Open, 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("LPT1端口未打开!");}}public bool Close(){return CloseHandle(iHandle);}}
}
RawPrinterHelper类
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;}}
}
当点击打印的时候
string sBarCodeCMD = ""; //条码打印命令
//多行汉字打印 StringBuilder strbd1 = new StringBuilder(10240);StringBuilder strbd2= new StringBuilder(10240);StringBuilder strbd3 = new StringBuilder(10240);StringBuilder strbd4 = new StringBuilder(10240);int i1 = GETFONTHEX("打印的文字", "宋体", "temp1", 0, 30,20, 0, 0, strbd1);int i2 = GETFONTHEX("XXX:", "宋体", "temp2", 0, 20,15, 0, 0, strbd2);int i3 = GETFONTHEX("XX:", "宋体", "temp3", 0, 20,15, 0, 0, strbd3);int i4 = GETFONTHEX("XX:"+DateTime.Now+"", "宋体", "temp4", 0, 20, 15, 0, 0, strbd4);sBarCodeCMD = strbd1.ToString() + strbd2.ToString() + strbd3.ToString() + strbd4.ToString() + @"^XA^MD30^LH20,20^FO80,200^XGtemp1,1,1^FS ^LH20,20^FO80,240^GB620,0,2^FS ^LH20,20^FO80,260^XGtemp2,1,1^FS ^LH20,20^FO80,290^XGtemp3,1,1^FS^LH20,20^FO80,320^GB620,0,2^FS ^LH20,20^FO80,350^BY1.5,3,100 ^BCN,100,Y,N,N^FD370921000001013090312024^FS^LH20,20^FO80,480^XGtemp4,1,1^FS^XZ";RawPrinterHelper.SendStringToPrinter("ZDesigner GK888t (EPL)", sBarCodeCMD);
打印后的效果大致如下:
注意这是code128,其实大多都差不多,只是指令不同而已。
打印的汉字
____________________________________
XXX
XX
时间
条码
转载于:https://www.cnblogs.com/jason-davis/p/4447275.html
关于使用条码打印机指令打印汉字的问题相关推荐
- [条码打印]使用斑马语言(ZPL)打印汉字
默认情况下条码打印机是不能打印汉字的, 不过条码打印机是支持上传自定义字体的, 但是这个字体库跟windows里面的字体库肯定不是一回事, 起初我觉得最好能通过上传字体来实现打印汉字, 但是大概研究了 ...
- Android sockot连接打印机EPSON ESC/POS指令打印
sockot连接打印机EPSON ESC/POS指令打印 接了一个需求,需要用Android pad连接打印机进行打印,以前倒是没接触过,这次在网上找了下资料,简单实现了下需求.在这记录下相关代码以及 ...
- C#控制DataMax指令打印DPL问题总结
最近这几天在测试DataMAx-I-4208采用DPL[Developer Programm Language]指令方式进行遇到诸多问题.解决这个问题过程中也是不断打印测试得到验证.今天早上用程序批量 ...
- NSArray打印汉字的方法
(1) NSArray打印汉字 通过重载NSArray的- (NSString *)descriptionWithLocale:(id)locale方法 方法体例如以下: //依据设置的locale ...
- 指令打印与驱动打印随笔
本文对指令打印和驱动打印做了一个简要的介绍,分享了在开发客户端打印组件时的一些过程并提出了一个新轮子用于解决老的问题并引出更多的新问题.全文大概 3500 字无图,阅读大概需要 7 分钟. 驱动打印是 ...
- 单片机 驱动 标签打印机tsc_指令打印与驱动打印随笔
本文对指令打印和驱动打印做了一个简要的介绍,分享了在开发客户端打印组件时的一些过程并提出了一个新轮子用于解决老的问题并引出更多的新问题.全文大概 3500 字无图,阅读大概需要 7 分钟. 驱动打印是 ...
- C# 博思得 POSTEK 打印机 打码机 SDK 二次开发 指令打印
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.调用SDK实现打印 前言 提示: 公司要实现 BarTender的类似功能.POSTEK 提供了开发C++ 的 S ...
- Android在针式打印机上通过ESC/P指令打印二维码
Android在针式打印机上通过ESC/P指令打印二维码 前言 正文 前言 最近有个需求就是在rk3399上通过usb口打印发票单,各大品牌的针式打印机几乎都没有Android平台的SDK,后查找相关 ...
- C# EPL USB 指令打印
转载:http://www.cnblogs.com/rinack/p/4843627.html 上传一个EPL语言的模板:SOE05640007536.epl2 N A23,19,0,1,2,2,N, ...
最新文章
- 40+场面试,100%通过率,我想分享的 14 条经验
- 【项目管理】认识沟通管理
- [云炬ThinkPython阅读笔记]2.9 术语表
- [Guava]-使用Iterators进行分组时遇见的坑
- pivotal_Spring Data Pivotal Gemfire教程
- ajax无刷新评论的思路,ajax学习——ajax版无刷新评论(数据库)
- activiti jbpm相关资源
- npm install 卡住的时候的处理
- 孟菲斯风格海报设计素材,艺术一点点
- mybatis-plus 官方发布神器,一个依赖轻松搞定数据权限,再也不用自己实现了!...
- ARP 地址分类 NAT技术
- HTC6950新手基本操作方法
- cas27647-84-3四羧基苯基卟啉锌;四羧基苯基锌卟啉TCPP-Zn(2+)/分子量:850.116160000001
- puzzle(010.1)自我指涉的选择题
- 7723java世界Ol,《世界OL》装备镶嵌
- BUUCTF Misc wp大合集(1)
- 比较全的Struts介绍04
- Vulnhub——JANGOW: 1.0.1
- system函数和signal(SIGCHLD, SIG_DFL)的“固定搭配”
- 离谱,还有这种自暴自弃的翻译?
热门文章
- 《深入浅出4G网络 LTE_EPC》阅读笔记一
- png mat 转 osg
- 一个为程序员定制的、WPF开发的小巧、美观桌面快捷工具
- 使用纯CSS实现未知尺寸的图片(但高宽都小于500px)在500px的正方形容器中水平和垂直居中。你有几种方法?
- 中心频率法确认VMD的K值的python实现
- 03-MySQL:DBeaver 客户端使用
- Cris 学 SpringMVC(二):使用 servlet 原生 api 作为方法入参
- 【数据库】主键,超键,候选键,外键区别与联系?
- 微信小程序添加开发者、赋予权限、添加体验者
- 江南大学计算机科学考研书目,2019江南大学计算机考研初试科目、参考书目、复试线...