先擘4T530(TSC打印机) python、安卓 sdk安装字体中文打印
最近项目需要安卓双屏能够调用打印机,就采购了一款热敏/热转印打印机,内核是基于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,20mm
GAP 0,0
CODEPAGE 936
CLS
TEXT 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__':
pass
a_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 270
qrcode_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 = 60
text_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 = 60
text_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、本文中用到的资料文档、工具等也一并传于上述仓库自取之!
基于互联网精神,在注明出处的前提下本站文章可自由转载!
本文链接:https://ranjuan.cn/4t530-tsc-printer-python-sdk/
微信赞赏支付宝赞赏
发表评论