最近公司有一个项目,在仓库中对瓜果蔬菜按照规格打包,打包以后需要称重贴上标签。标签上有条形码,商品编码,商品名称,重量,操作员姓名等信息,这些信息存储在后台数据库中。这本来是一个cs架构的应用,在桌面端查询和显示后台的商品信息,选中商品以后开始称重,称重结果由串口传到桌面前端程序,实时展示。手动触发标签打印按钮,打印机打印标签,操作员把标签贴在包装袋上。
整个项目比较急,一开始定的任务只有我一个人,从开发到测试上线的时间不到两个星期。时间比较紧,从技术的角度来看,并没有什么技术难点,但是涉及到的点比较多,而且都是从来没用过的,比如前端页面用什么来画,实时读取电子称串口数据,打印机静默打印等。
初步调研结果,桌面页面用PyQt5来做,编程语言选用python,打印机型号为DL-620,电子称需要能通过usb将数据传到电脑。
后面觉得开发和测试总的时间太短,对需要用到的库都不熟悉,经过讨论更改方案,方案改为,PyQt5实现页面窗体,页面内容用html实现,业务逻辑在本地使用python实现,用到的技术为PyQT5中自带的WebEngineView,这里涉及到python和html之间的数据交互。(一个项目差不多做完,对PyQt相对也熟悉了一些,其实发现存粹用PyQt来实现也不是很复杂,如果有第二版,则全部用Pyqt来做),电子标签的打印也可以用PyQt中的QtextDocument来实现,不过我这里走了一些弯路,先由代码生成pdf文档,再打印,一开始觉得这样做很简单,没想到难点在于pdf文档的静默打印(调研时看到python调取打印接口就几行代码),结果那些代码打印pdf都会先打开pdf文档,然后再打印,在这个任务中这是不被允许的。必须静默打印,这里花了一天半的时间制作pdf和实现静默打印
这里只是简单的记录一下这个项目,以及项目中用到的一些平时很少用到的包
各个环节用到的包如下:
读取串口数据:serial
桌面界面:PyQT5+Html5,其中涉及到的点有:WebEngineView,WebChannel实现python和html中javascript交互(python调用页面中的javascript和javascript调用python代码),这里没有用django这样的框架,如果使用这个框架应该会更加简单,与页面交互的工作由框架完成了,但是此处是cs架构,一个桌面应用程序,没有服务的概念,所以没有使用
python代码生成pdf文档:reportlab包
静默打印pdf文档:hostscript (gswin32),这个工具很强大,但是涉及到的命令行参数也很多,用法和各参数的详细解读这里有一篇很棒的博客:
我这里用到的静默打印pdfwen文档命令备忘:
>gswin32c -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNOPROMPT -dNumCopies=1 -sDEVICE=mswinpr2 -dFitPage -dDEVICEWIDTHPOINTS=210 -dDEVICEHEIGHTPOINTS=297 -sOutputFile="%printer%DASCOM DL-620Z" "form_letter.pdf"
各参数解释:
-dPrinted:打印,而不是打开到桌面窗体
-dBATCH:执行到最后一页退出
-dNOPAUSE:每一页转换之间没有停顿
-dNOSAFER:通过命令行运行
-q:-dQUIET:执行过程中尽可能减少日志信息
-dNOPROMPT:没有相关提示
-sDEVICE:指定输出设备
dDEVICEWIDTHPOINTS=210 -dDEVICEHEIGHTPOINTS=297 设置打印纸的大小,默认是a4纸,我这里是标签纸,小得多
先简单记录这个项目,后面开放源码到github