一种基于Python语言开发设计的打印服务器

(整期优先)网络出版时间:2023-04-17
/ 2

一种基于Python语言开发设计的打印服务器

王博成,贺华斌

中车株洲电力机车有限公司,湖南 株洲  412001

摘要:本文主要是针对在Windows环境下,对于打印模块进行的一种设计开发。特点是开源免费、无插件、免安装、纯自动化静默打印、模板自定义、模板可视化编辑、可针对对应模板选择默认打印机。代码精简,功能全,辅助工具为EXCEL打印精度高。支持条码、二维码打印。基本满足打印服务器开发需求。软件由Python语言开发,具有开源易用的特点优势。

关键词:Python、打印服务器、静默打印、模板套打

1绪论

1.1系统研究的目的意义

在目前的B/S架构办公系统中,打印单据已经成为了一种必须的开发模块。在该环境下对于打印要有能满足静默打印和模板套打的需求。目前市面上常用的解决方案可以分为四种,1、通过游览器自带的打印功能去打印页面。2、利用IE游览器支持ActiveX插件来实现打印3、通过Javascript+CSS截取页面调用打印。4、通过Javascript插件运行相关服务支持打印。

这四种方案各有个的缺点,直接页面打印精确度控制很差。并且IE游览器已经停止服务,其余游览器也会禁止ActiveX。而通过Javascript+CSS打印,相关格式模板需要利用Office办公软件设计完后,另存相关HTML文件去当成打印模板。调整较为繁琐。游览器即使支持静默打印指令,但无法做到对每一个模板都去设置一个打印机。打印多模板时非常麻烦,要么手动更改默认打印机,要么不用静默打印。最后通过Javascript插件去实现打印。由于市面插件水平参差不齐,基本无法同时满足静默打印、自由模板打印、对应模板默认对应打印机打印。同时也存在模板难设计,开发效率低下,且大多数插件并非免费开源,会对开发成本产生一定的影响。

本系统开发是基于Python语言开发,具有开源易用的特点优势。针对在Windows环境下,对于打印模块进行的一种设计开发。特点是开源免费、无插件、免安装、纯自动化静默打印、模板自定义、模板可视化编辑、可针对对应模板选择默认打印机。代码精简,功能全,辅助工具为EXCEL打印精度高。支持条码、二维码打印。基本满足打印服务器开发需求。

2理论基础

2.1WebSockets库介绍

WebSockets 是一种先进的技术,一个HTML5新增的协议在浏览器和服务器之间建立一个不受限的双向通信的通道比如说,服务器可以在任意时刻发送消息给浏览器。无需通过轮询服务器的方式以获得响应。

在Python语言中就有WebSockets库。我们可以很方便的调用这个库来作为服务器的通讯基础。[1]

2.2xlwings库介绍

xlwings 是 Python 中操作Excel的一个第三方库,支持.xls读写,.xlsx读写,能够非常方便的读写Excel文件中的数据,并且能够进行单元格格式的修改。xlwings还可以和matplotlib、numpy以及pandas无缝连接,支持读写numpy、pandas数据类型,将matplotlib可视化图表导入到excel中。最重要的是xlwings可以调用Excel文件中VBA写好的程序,也可以让VBA调用用Python写的程序。通过xlwings我们可以将二维码更新到EXCEL中,同时也可以通过api接口的调用去完成打印。[2]

2.3win32print库介绍

Python通过调用win32print模块,可以实现对已安装的打印机进行一系列管理,通过EnumPrinters方法就可以获取,数字大小可以调整,以获取更多或更少的信息。同时对于该库存在一个函数SetDefaultPrinter,参数设置为对应打印机编号即可调整系统中的默认打印机。

2.4 PyQt5库介绍

PyQt5 是Digia的一套Qt5应用框架与python的结合,同时支持2.x和3.x。Qt库由Riverbank Computing开发,是最强大的GUI库之一 , PyQt5是由一系列Python模块组成。超过620个类,6000函数和方法。能在诸如Unix、Windows和Mac OS等主流操作系统上运行。PyQt5有两种证书,GPL和商业证书。同时由于兼容性的考虑PyQt5库是构建前台GUI最好的选择之一。[3]

3算法逻辑

3.1服务器端与Web端通讯

首先我们要通过本机的端口建立一个websocket通讯利用serve函数开始创建服务,同时利用异步的方法编写防止堵塞。另外如果我们想用本机的IP地址来开一个端口需要一下。

socket库的socket函数往任意一个活跃的ip地址发送一下连接,通过getsockname函数再获取本机的ip地址。

3.1核心算法

首先是制作模板,可以通过两种方式进行,第一种就是利用xlwings库去新建编写EXCEL表格。纯代码编写模板,这种方法集成度较高,占用存储空间较少,单个模板效率较低,多用于批量生成模板。第二种就是用EXCEL编辑好后保存,之后在利用xlwings去操作。

由于不同模板可能会调用不同的打印机,例如打印条码有专门的条码打印机,打印箱单调用A4打印机等。这时候我们需要利用PyQt5去设计一套图形化页面,利用GUI的便捷性选择打印机。此时我们利用win32print模块调用EnumPrinters获取打印机信息(该函数的参数填2即可获取名称),同时利用SetDefaultPrinter函数去设置默认打印机。但需要注意的一点就是SetDefaultPrinter函数的参数是int类型,这时候我们需要利用迭代遍历EnumPrinters函数的值去匹配打印机名称来获取打印机的顺序号在填入SetDefaultPrinter函数去设置。

利用从websocket接受到的消息后,系统就要开始调用xlwings库去操作打开EXCEL,将模板打开,之后去将数据填入模板中,之后利用xlwings库自带的api的函数PrintOut调用默认打印机完成静默打印。


图1:打印服务器流程(样例)

4代码模块

4.1样例代码浅析

函数get_host_ip(): 返回本机ip地址,详见图2。用于与后续B/S架构游览器客户端进行通讯。

图2:获取本机IP地址

打印服务器开启websocket服务,详见图3。

图3:开启Websocket服务

函数recv_msg()接受到发送过来的字符数据将其解析,并调用相关配置文件改变默认打印机方便后续进行静默打印,详见图4

图4:处理收到数据(部分)

函数startprint(getjson)是用于打开相关模板并做好设置后调用打印的函数。参数getjson是从函数recv_msg()接受到并序列化好的字典数据。函数startprint利用xlwings打开好EXCEl并调用api去打印,详见图5

函数setvalue(sh,dic)用于将打印模板中需要填写值填充到EXCEL中。同时可以看到模板中有一个二维码需要填充。这时候该函数利用qrcode库去生成一张二维码。然后我们利用xlwings中存在的图片替换去将二维码填入相关模板中。

图5:处理收到数据

ExampleQWidget)用于创建一个PyQt5页面,该类获取到打印机名称供用户选择并针对对应模板更改打印机并写入配置文件。方便后续打印调用。

图7:PyQt框架下的GUI(部分)

4 结束语

本文主要是针对Python开源语言快速开发一个打印服务器。该项系统可以满足信息传递安全性、静默打印、独立模板打印、对应打印机打不同模板。同时压缩开发周期,节约成本。从而通过较少的投入获得满意的回报。并且填充市面上开源打印模块的空白。

参考文献

[1] 练冬兰.Python与机械教育初探[J].科技创新导报,2019(01)

[2]林桥;张卓凡;肖超波;陈成;徐加初.基于Python语言开发的压力容器与管道安全评定系统[J]. 石油和化工设备,2021(11)