写这篇文章前,要先感谢珠海佳博,上海芝柯的支持,借打印机、帮忙处理指令机指令的问题
前言
19年4月的样子,一个销售朋友找我,叫我帮他整个物流公司的移动(小程序)打印项目,我二话没说就答应了,从此就踏上了折腾之路,做过标签打印项目的都知道,打印模板是要自己用打印机指令一个指令一个指令调的,没预览界面,调好后,就打印一下,整个项目做了差不多两个月,其中一个月时间用在调模板上面,为什么这么久?
- 以前没做过这方面的东西,打印机指令要重新看文档熟悉
- 确实是指令不好调试太麻烦,每天都打好几斤的标签纸
- 换了打印机,一开始用的打印是
TSPL指令的,后来因为某些原因,换了台,用的是ZPL的,也就是说我前面写好的指令废了- 客户想法太多,你把这两个换下位置,你这里加也方框,我要打勾,这些数据你要给我用程序自动打勾,不行不行,这样感觉还是不好,我用纸给你画一个出来,对,就这样,这些字你加粗一下,巴啦巴啦一大堆
日常工作打印的标签
最后这项目做完后,人也消瘦了,MMP
事情的经过就是这样,我寻思着,以后再做打印机项目的话,我估计会死,不行不行,我能不能整个东西,一个有GUI界面的网页,用户想要什么样的模板,用户在上面编辑好模板,我写个程序把模板转换成打印机指令呢?说干就干
标签模板 v0.1
先验证下自己的想法是否可行,丑丑的界面,功能勉强能用,服务器定义一套json格式,做个简单的替换,把json解析成不同的打印机指令
标签模板 v0.2
v0.1免强能用,v0.2主要就是美化界面和优化操作体验了,加了些常用组件,文字,数据,二维码,服务端没啥大的改动,嗯[托腮],像个样子了
标签模板 v0.3
v0.2也还OK,但是组件还不够,上次那个打印表格废了我不少时间,这个一定要加上,打印机指令是没有打印表格的指令的,要怎么画呢?当时的做法计算好x,y,w,h用^GB指令,画了N个矩形,现在的模板渲染是一系列的水平线和垂直线,继续折腾
开发到这里的时候,已经接近19年底了,嗯[托腮],现在这些东西已经基本能满足我的开发了,再也不用像上次那样搞了
标签模板 v1.0
我以为这个项目应该就这样了,结果2020年疫情来了,大家都在家办公,我也刚回到珠海,佳博的朋友说想用我这项目推他们的云打印,这个做他们的模板服务,我一惊,这玩意我只是用来给自己用的,用给大厂用肯定不合适,因为还有些问题没有解决
- 操作不够友好,
- 如果打印机不支持矢量字体(
TSPL,ESC,CPCL),打印结果会有偏差,现在做法是用4舍5入来取字体大小的,假如打印机支持的24像素的字体,你写的是26,我会转换成24,如果你用的是38,我会转换成24然后放大2倍- 内容自动换行的问题,打印机指令是不会给内容自动换行的,这个要你自己处理
再多的问题也阻挡我不了我前进的步伐,这里换了个思路,没再像以前一样所有的转换成指令,因为打印机指令太多了,适配不过来,我直接把数据和模板生成html,然后再把html转换成图片,这样要适配新的打印机指令,我就只要适配图片指令就好了,图片还有个好处,可以自己设置字体,下面这个是用雅黑渲染的,也可以解决指令的兼容问题和国际化问题
v1.0上线,打印出来的内容比以前确实好了,也解决了上述的3个问题,但是也带来了新的问题,打印机指令相比纯指令,内容更大了,佳博的CH421D用起来没啥问题,但是其它的打印机就很明显感觉到慢,特别是用小程序蓝牙打印的时候,10秒一张,问题先放着,以后再解决
这个版本还加了个功能,就是可以通过接口把数据post到服务器,服务器生成相应的打印机给本地打印机用的(蓝牙机、USB连接的设备),这些是给像我这样的开发者用的,要做打印项目,但是不想在模板编辑上太浪费时间
上面说到佳博想用这个做他们的模板服务,因为他们想自己管理用户信息和数据的录入,于是我切了一个分支出来,做了一个企业版,给类似这种大厂用的,我这只负责数据的存储和渲染,其它他们自己开发,其它功能都还好,没啥问题,但是上面说到指令太大的问题还是出现了,这次他们用的是TSPL的打印机,生成的指令数据75k,打印机那边接收数据太慢了,打一张标签要7s左右,完全不能接受的
标签模板 v1.1
上面说到指令渲染成图片生成的指令太大了,但是如果不用图片,上述那3个问题该怎么解决呢,客户有问题,我当然要积极配合解决啊,嗯[托腮],好像不太好弄啊,思前想后,决定用混合渲染模板,数据能转换成指令的都转换成指令,不能转换成指令的,转换成尽可能小的图片,这个版本主要改的都是服务器的代码,旧的渲染引擎要重写,针对上述问题,解决方案如下:
- 没问题
- 打印机支持的字体大小,直接用对应的指令,不支持的,转换成图片,图片做下裁剪,只显示内容区域,其它白边裁剪掉,并调整相应的坐标和宽高,保证尽可能小
- 字符分割算法,动态计算字符宽度和内容宽度,超过或遇到换行标签,再添加一个文字指令,调整文字指令的坐标
优化后
不支持矢量字体渲染出来的图片(白色背景的)
这里主要是对图片进行了水平裁剪(垂直的还没做),只显示内容区域,比如你创建模板的时候如果设定的是
100像素,但实际渲染出来的内容只用了50像素,那么这里就会裁剪掉50像素,在保证内容正确显示的前提下,让图片尽可能的小,这样处理后,指令大小可以比以前小一半
这个是混合渲染的(16K)
这个是完全转换成指令的(500字节)
这个是用混合渲染打印出来的
至此,模板功能基本开发玩了,后面该怎么开发,我也不及道了,个人希望通过这个模板服务做一些企业的内部系统定制开发,因为这个模板服务如果不对接实际的业务,用起来其实也挺鸡肋的,开发过程,我也有尝试做一些小程序来辅助使用,网页端配置DB,小程序扫码检索出来,然后再打印,但是感觉实际使用过程中,大厂自己的系统有了,小厂压根就没有DB,就这样不了了之了
提示
接口大家可以用来调试用下,但是先不要放到生产环境,为什么呢?因为哥没钱啊,现在这个项目部署到阿里的k8s上面,数据库,redis买的都是云产品,不是自己搭建的,万一哪天哥撑不下去了,可能就会停了
感谢阅读