本篇目录
最近项目需要安卓双屏能够调用打印机,就采购了一款热敏/热转印打印机,内核是基于TSC打印模块的,使用TSC的sdk调用都是正常的,记录一下一些坑点!安卓usb连接TSC打印机的demo已传git仓库,有需要的直接文末自取!
一、准备工作
1、购买时客服给的资料严重不全,就去官网找了相关资料。http://www.zenpert.cn/support.html里面有设置软件可以下载,DiagTool这个软件很重要,因为我买的这款打印机默认不带字体!无法打印中文,调试sdk打中文怎么都打印不出来!

2、关于开发SDK问题可以去TSC官网下载,https://www.chinatsc.cn/zh-CN/downloads不知道为什么我写本文时去看只剩几个SDK了,如果官网下不到那只能尝试联系官网客服或者你购买的店铺客服了!

3、我之前下的是python sdk 必须要有python环境,其实就是个TSCLIB.dll然后python调用dll方法,还是比较简单的。
TSC打印机提供了一些封装好的dll函数可以直接调用,其中包含了sendcommand这个方法,如果想要实现控制程度更高的打印,建议直接用sendcommand来发送相关打印指令!这个打印指令其实就是TSPL_TSPL2指令,参考TSPL_TSPL2指令文档就可以了!
如果是连续纸,我用dll方法里的setup(a,b,c,d,e,f,g)这个设置好像没设置成功,不知道是bug还是我配置参数有问题,后面我是直接sendcommand里面发送纸张设置指令的(见文末python代码)


4、连接打印机,正常不需要安装任何驱动(至少我这款打印机无需安装)

二、使用DiagTool安装字体
注意arial.TTF安装后是无法打印中文的,因为它不支持中文,你怎么试也没用,一开始我以为是我字体安装的不对!一般建议安装黑体simhei.ttf(黑体),这个字体文件可以网上下载或者去windows字体目录下复制。
1、在C盘根目录创建一个DIAGTOOL文件夹,然后把工具软件和要安装的字体都复制进去

2、选择字体文件,默认会把系统字体文件拉出来,如果选择报错可以定位到DIAGTOOL文件夹里面的字体文件(这些字体文件也可以自己先从windows字体文件里面复制出来)


3、至此TTF字体安装就完毕了。下面是另一种安装点阵字的示例(最终安装字体名字是FONT001,安装TTF一般就可以了)

传送字体可能会异常,导致打印乱码,可尝试档案格式化后重新传相关字体。改工具软件可直接发送命令调试

SIZE 58 mm,20mmGAP 0,0CODEPAGE 936CLSTEXT 48,12,"FONT001",90,2,2,"你好啊123456"PRINT 1,1三、使用python打印
我这里是在打印机里安装的58mm收银小票打印的,连续纸。
原谅的我懒惰,直接贴源码了,里面有很多测试时临时的语句忽略即可。
'''Created on 2018 @author: programmer'''import ctypes '''tsclibrary = ctypes.WinDLL("c:64TSCLIB.dll");'''tsclibrary = ctypes.WinDLL(".//libs//TSCLIB.dll") if __name__ == '__main__': passa_str = "HELLO WORLD"print(a_str)#tsclibrary.about(); #显示dll版本号#tsclibrary.openportW("TSC TX200");r=tsclibrary.openportW("USB")print(r) # sendcommand 发送tspl指令到打印机# 门票打印购买的是300dpi的打印机(TE310模块?),计算定位点时注意 :# 1. 203 DPI, 1mm=8 dots ; 300 DPI, 1mm=11.8 dots# 2. 数值只有整数部分会被使用. Ex. 2 mm = 23.6 dots 所以会被看作 23 dots .# tsclibrary.sendcommandW("SIZE 80 mm, 160 mm"); #这条指令用来设置纸张的宽度及高度(tspl文档有图示说明)# tsclibrary.sendcommandW("GAP 3 mm, 0 mm"); # 定义两张标签纸中间的间隙高度#tsclibrary.sendcommandW("OFFSET 10 mm"); # 此条指令将为每一张标签定义额外的送纸偏移,对于剥纸模式及裁切模式下,调整此条指令,可以使打印机将#纸张停留在预期的位置上。打印机在每次打印前会将额外设定的距离回卷后再打印。 不超过1英尺,25mm# SPEED 打印速度暂不设置# DENSITY 打印浓度暂不设置#---上面指令在调试打印机时需要设置固定参数?? #tsclibrary.sendcommandW("DIRECTION 0"); # 对应tspl文档的DIRECTION and Mirror Image;定义打印机的打印方向及内容是否镜面反射,此设置将会保存在打印机的内存中 # REFERENCE 起始参考点,理论上可以不用设置,后面打印都直接用坐标定位# CODEPAGE 此条指令用来定义不同的国码编码,如果设置不正确可能导致中文输出乱码??UTF-8、936(ps:936=gbk)# FEED 此条指令用来命令打印机送出规定长度的纸张,长度的数值单位为 DOT--300 DPI: 1 mm = 12 dots# FORMFEED 无需参数,此条指令用来将纸张推送到下张标签的起始位置。# HOME 无需参数,此条指令会使打印机持续出纸,直到打印机感测器侦测到纸张的起始位置。此条指令必须要在 SIZE 及 GAP 之# 后使用# SOUND 2,200 (2/10 声音大小,200/4095 频率# CUT 此条指令会使打印机立刻裁切一次,并不执行回拉动作# LIMITFEED 限定定间隙校正执行的最大长度,若在此长度范围内无法测得间隙存在,则将传感器模式定为连续纸模式# SELFTEST 此条指令将立即打印机的自检信息# INITIALPRINTER 此条指令会将打印机恢复至出厂设置 #===================打印输出==================# PRINT 1,1 【执行打印操作-一般最后一个指令为PRINT,该指令可根据参数打印多份】# BAR 绘制线条,一般用于【分割线】# BITMAP 绘制 bitmap 图像(参考 BMP 图片)# PUTBMP 打印 BMP 格式的图片(需先download下载到打印机)。只有热敏型打印机支持灰度打印,且仅支持 1-bit (单色图) 和 8-bit (256 色) BMP 图片# BOX 画线条方框,CIRCLE画圆;ELLIPSE画椭圆# ERASE 清除对应区域图像缓存,比如给一个色块图像 挖空内部# QRCODE 绘制二维码;如果是字母与数字混合的,则需要指定内容格式,A、N、B、K、!# REVERSE 将指定区域的图像缓存反白# DIAGONAL 斜线# TEXT 打印一段文字,注意字体选择调试,可以旋转角度# BLOCK 打印文本段落,可以旋转角度# <ESC>!? 立刻获取打印机的当前状态,即便打印机是出于报错的状态 #===========# SET CUTTER 设置命令裁刀工作,或停止工作。可以定义裁刀一次裁切多少张已打印的标签,打印机电源关闭后,不会清除# SET PARTIAL_CUTTER# SET BACK 此指令会被用在 SET CUTTER 方法之后。设定此参数时,打印机裁切后,会不回拉立刻进行打印# SET TEAR & SET STRIPER 开启或者关闭打印机将纸张送出到间隙或者黑标位置用来撕去。此设定在将会保存在打印机记忆体中,关机后# 不会被清除,注意是支持TSPL 还是TSPL2语言的打印机# SET GAP 设置间隙感测器的强度# SET BLINE 开启或者关闭感测器的反转功能,一般不需要此设置# SET REPRINT 开启或者关闭在”缺纸”,”无碳带”,”打印头开启”报错后的重印功能。# SET RESPONSE 设定打印机自动返回信息【可以设置任务id,然后等打印机返回id执行后的状态】 paper_width = 58 #打印纸张宽度paper_height =60 # 高度需要根据打印内容计算tsclibrary.sendcommandW(f"SIZE {paper_width} mm,{paper_height} mm") # 宽度根据纸张固定, 高度需要根据后面的打印内容计算出来!tsclibrary.sendcommandW("GAP 0,0")tsclibrary.sendcommandW("DIRECTION 0")tsclibrary.sendcommandW("CLS") # 此条指令用来清除打印机中的图像缓存(此条指令必须在 SIZE 后进行设定)tsclibrary.sendcommandW("REFERENCE 24,24") # 打印起始参考点 单位DOT, 300DPI: 1mm=12dots 11.8dots取整; 打印开始边距设置#tsclibrary.sendcommandW("TEXT 50,30,"3",90,1,2,"BA123456"") # 不能打印中文,旋转要注意布局点位否则旋转失败tsclibrary.sendcommandW("CODEPAGE 936") #936=GBK UTF-8=UTF 8 bar_width=int(paper_width*11.8)tsclibrary.sendcommandW(f"BAR 0,12,{bar_width},2") #开始横线 #qrcode_x= int((paper_width)*11.8/2) #距离打印原点/起始点的x坐标 dots--根据宽度(留60 dot安全距离)计算居中点位qrcode_x = int((paper_width-10)*11.8) #qrcode_y=60 #距离打印原点/起始点的x坐标---60 dot安全距离qrcode_cell_width=8 #取值1-10;应该是拼装条码的最小方块颗粒大小,值越小条码越细qrcode_rotation=0 # 旋转角度 0 90 180 270qrcode_justification= 'J3' # (J5需要计算距离打印原点的居中点位,距离避免超过打印区域),参考TSPL指令文档qrcode_area='X360'qrcode_content='http://www.busad5.com/mobile/bus/tickettest?sn=As5sdaQOCKF-45das6d4' #条码内容,英文数字的首位用A开头tsclibrary.sendcommandW(f"QRCODE {qrcode_x},{qrcode_y},Q,{qrcode_cell_width},A,{qrcode_rotation},{qrcode_justification},M2,{qrcode_area},"{qrcode_content}"")#tsclibrary.sendcommandW("QRCODE 70,50,Q,8,A,0,M2,X480,"Ahttp://www.busad5.com/mobile/bus/tickettest?sn=As5sdaQOCKF-45das6d4"") '''font_x = int(15*11.8) #距离边距15mm开始第一行文字font_y = 60 # 安全距离font_height = int(4*11.8) #4mm字体高度font_degree = 270 # 注意这里是逆时针旋转270度font_name = "Arial"font_content= "出票时间: 2024-11-08 14:00:01"tsclibrary.windowsfontW(str(font_x),str(font_y),str(font_height),str(font_degree), "0", "0",font_name ,font_content) # 使用 Windows TTF 字型列印文字,之前旋转不行执行此命令后可以#tsclibrary.windowsfontW("50","100","24","270", "0", "0", "Arial","你好Window Font Test") # 使用 Windows TTF 字型列印文字,之前旋转不行执行此命令后可以;Arial字体只支持英文,不支持中文'''text_x = int(15*11.8)-50 # 这里是第二行,要避开与第一行字重叠text_y = 60text_name = '3'font_rotation = 90 # 注意这里是顺时针90度font_content = 'time 2024-11-08 12:00:07'tsclibrary.sendcommandW(f"TEXT {text_x},{text_y},"{text_name}",{font_rotation},1,1,"{font_content}"") text_x = int(15*11.8)-50-30 # 这里是第二行,要避开与第一行字重叠text_y = 60text_name2 = 'FONT001' # 字体下载到打印机font_rotation = 90 # 注意这里是顺时针90度font_content = '请在出票2小时内核销使用 2024-11-08 12:00:07'#tsclibrary.sendcommandW(f"TEXT {text_x},{text_y},"{text_name2}",{font_rotation},3,3,"{font_content}"")tsclibrary.sendcommand(f"TEXT {text_x},{text_y},"{text_name2}",{font_rotation},2,2,"{font_content}"".encode('GB2312'))#tsclibrary.sendcommand("TEXT 148,12,"simhei.TTF",90,10,10,"[3]你好啊123456"".encode('GB2312')) # tsclibrary.sendcommandW("PRINT 1,1")#tsclibrary.printlabelW("1","1") #說明: 列印標籤內容tsclibrary.closeport() print('end')打印效果,横向字体是使用了打印命令里面的旋转角度来实现的!

安卓手机USB连接TSC打印机DEMO
1、另外也实测实现了安卓usb连接tsc打印机的功能,已传git仓库自取:Small-examples/TSC_DLL_SAMPLE at main · joolan/Small-examples (github.com)
2、本文中用到的资料文档、工具等也一并传于上述仓库自取之!
发表评论