1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 热敏打印机ESCPOS指令封装类 票据打印从此轻松 佳博系列实测通过

热敏打印机ESCPOS指令封装类 票据打印从此轻松 佳博系列实测通过

时间:2023-12-29 06:08:07

相关推荐

热敏打印机ESCPOS指令封装类 票据打印从此轻松 佳博系列实测通过

开发背景

接到一个任务,要用热敏打印机打印小票。本人用的是市面上比较常见的佳博热敏打印机。用过票据打印机的人都知道,在小票上打印与普通的打印纸上打印不一样。要通过发送ESCPOS 指令给打印机来完成打印任务,所以控制热敏打印可以看作是用ESCPOS 指令编程。

为此我专门上了佳博的官网,下载了《佳博热敏票据打印机编程手册.pdf》硬着头皮把相关的ESCPOS指令啃了一遍。深感有必要将这些极其不人性化的ESCPOS指令包装一下。为此将常见的打印功能封装成了一个python 类。 需要打印时直接调用该类相应的方法就可以了。如此一来顺利地完成了打印小票的任务。

核心代码

#coding=utf-8#调用usb热敏打印机#通过rawprint.exe发送打印数据给打印机#可以发送控制命令与普通文本import timeimport randomimport osimport uuid#esc指令escConst ={'esc':27,'gs':29,'lf':10,'dle':16,'eot':4,'enq':5,'dc4':20,'=':61}#当前工作目录workingDir = os.path.dirname(os.path.abspath(__file__))#将ESC指令转为整数def escToken2Int(token):token = token.lower()if escConst.has_key(token):return escConst[token]if token.isdigit():return int(token)return ord(token)#将ESC指令串转为列表def escStr2List(escStr):tmpList = escStr.split(' ')return map(escToken2Int,tmpList)#将ESC指令串转为可发送给打印机的数据def escStr2RawData(escStr):return list2RawData(escStr2List(escStr))#列表转为可发送给打印机的数据def list2RawData(intList):template = "%s"*len(intList)return template%tuple(map(chr,intList))#发送打印数据的可执行文件名exeFile = workingDir +'\\exe\\RawPrint.exe'#模板文件名保留,为以后打印复杂内容做准备#templateFile = workingDir +'\\template\\temp1.txt'#打印助手类class PrintHelper:def __init__(self,printerName):self.printerName = printerNameself.reset()#重置,清空缓冲区def reset(self):self.buffer =''self.appendCmd("esc @")#添加普通文本def appendText(self,data):self.buffer+=data#添加控制命令def appendCmd(self,cmd):self.buffer+=escStr2RawData(cmd)#添加条码,条码宽度现在规定为12位,形如:123456789012def appendBarCode(self,code):if len(code)>12:code = code[0:12]if len(code)<12:code = "0"*(12-len(code))+codetmpCode = code[0:2]+" "+code[2:4]+" "+code[4:6]+" "+code[6:8]+" "+code[8:10]+" "+code[10:]#print tmpCodeself.appendCmd("esc @")self.appendCmd("27 97 2")self.appendCmd("GS w 3")self.appendCmd("GS h 120")self.appendCmd("29 72 2")#GS k 73 8中的8指后面8个字节被视为条码数据,如果数据过多,超过打印宽度则不会打印出条码self.appendCmd("GS k 73 8 123 67 "+tmpCode.strip())self.appendText('\n')#添加列表数据def appendList(self,intlist):self.buffer+=list2RawData(intlist)#将缓冲区中的数据发送到打印机def printTask(self):dataFile = workingDir +'\\data\\'+str(uuid.uuid1())+'.txt' #准备将打印数据写入数据文件 dataHandle =open(dataFile,'w')#控制命令 打印条码dataHandle.write(self.buffer)dataHandle.close()#让usb打印机执行打印作业cmdLine = exeFile +" "+ self.printerName +" "+ dataFileos.system(cmdLine)os.remove(dataFile) #删除临时文件#将文件中的数据发送到打印机def printFileTask(self,fileName):dataFile = workingDir +'\\data\\'+fileNamecmdLine = exeFile +" "+ self.printerName +" "+ dataFileos.system(cmdLine)#当前时刻def now(self):return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

实际打印的工作步骤

1, 将打印机通过usb连接到电脑上,本人用的是win10操作系统

2, 安装打印机对应的驱动(打印机附带的光盘上应该有,否则可以上官网上下载)

安装好后应该在设备和打印机界面上看到安装好的打印机

请注意打印机的名字我用红笔标出来了,这台打印机叫iSH58。如果在其它的电脑上,名字可能有不同。Python程序就是根据打印机的名字,找到这台打印机并向它发送ESCPOS指令的。

3,用到了微软提供的一个小工具:RawPrint.exe。这个程序只有28k.它的作用是将原始的打印指令发送给指定的打印机。在我提供的源码里面附带了这个小工具,(也可去微软件的网站上下载/download/platformsdk/utility/95/win98/en-us/rawprn.exe)

4 ,调用python编写的封装类PrintHelper的各种方法,完成打印工作

下载完整实例

完整实例中不仅包括了上文中的核心类:PrintHelper,还含打印票据的辅助类,打印票据的实际例子程序,打印条形码的例子程序等。感兴趣的请至CSDN下载中心 下载

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。