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

开发背景

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

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

核心代码

#coding=utf-8

#调用usb热敏打印机
#通过rawprint.exe发送打印数据给打印机
#可以发送控制命令与普通文本

import time
import random
import os
import 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 = printerName
		self.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位,形如:123456789012
	def appendBarCode(self,code):
		if len(code)>12:
			code = code[0:12]
		if len(code)<12:
			code = "0"*(12-len(code))+code
		
		tmpCode = code[0:2]+" "+code[2:4]+" "+code[4:6]+" "+code[6:8]+" "+code[8:10]+" "+code[10:]
		#print tmpCode
		self.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 +" "+ dataFile
		os.system(cmdLine)
		os.remove(dataFile)    #删除临时文件

	#将文件中的数据发送到打印机
	def printFileTask(self,fileName):
		dataFile = workingDir +'\\data\\'+fileName
		cmdLine = exeFile +" "+ self.printerName +" "+ dataFile
		os.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.它的作用是将原始的打印指令发送给指定的打印机。在我提供的源码里面附带了这个小工具,(也可去微软件的网站上下载http://download.microsoft.com/download/platformsdk/utility/95/win98/en-us/rawprn.exe)
4 ,调用python编写的封装类PrintHelper的各种方法,完成打印工作

下载完整实例

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

猜你喜欢

转载自blog.csdn.net/littlezhuhui/article/details/92632662