目前WMS以及考拉小店系统内的打印方案用的都是客户端打印的方案,借助了Lodop打印控件来完成打印操作。
背景
Q:为什么需要借助Lodop,而不直接用window.print()
?
A:我们的业务场景有几点是window.print()
无法满足的,比如:
- 需要无预览界面直接打印
window.print()
是采取截屏打印的策略,而我们的业务场景都是大多都是需要自定义HTML模版进行打印。- 我们有云打印的需求,也就是指定一个局域网ip,从指定ip下打印而不是本地打印。
基于以上几点原因,必须要借助打印机控件来完成,而多方了解之后,目前各大公司WMS的打印业务大部分采用的都是Lodop的方案。
Q: Lodop是如何完成上述的这些功能的?
A:我们都知道,浏览器环境对于系统设备的控制能力是比较弱的,或者说浏览器的BOM接口对于设备调用这方面暴露给开发者的功能都是阉割版的,包括摄像头调用,打印机设备调用等等。而如果是CS架构的系统对于设备调用就轻松多了,而Lodop就是浏览器和设备之间的桥梁。我画了一个简单的图,大致代表Lodop的工作方式:
- Lodop是一个客户端,需要在打印机主机上安装,运行的时候会起一个http服务。
- 浏览器端需要去加载这个http服务上的一个JS文件,这个JS文件中会建立浏览器和Lodop客户端的websocket链接
- 浏览器端通过websocket发送打印指令,Lodop接收指令,调用系统原生打印方法进行打印控制
如何在系统中使用
1. 安装Lodop
到Lodop官网下载Lodop综合版,安装在连接打印机的主机上。
2. 在需要打印的系统中引入下面的初始化脚本。
3. 初始化完Lodop实例之后就可以根据官网的Lodop技术手册来调用相应的打印接口了。
一些坑
看起来Lodop的使用比较简单,但是真正开发的时候会发现里面坑很多,下面记录一些目前已知的坑和解决方案。
Q:Lodop打印出来的页面带有水印,如何去除?
A: Lodop默认打印出来会带有一个Lodop的水印,如果需要去掉水印的话需要购买他们的License。
Q:为什么不同的电脑打印出来的效果不一致?
A: 1. Lodop在渲染的时候调用的是本机的ie浏览器渲染引擎,所以需要在安装Lodop的机子上安装ie11,我在仓库实施的过程中发现ie11以下的浏览器版本会因为CSS兼容性问题会出现布局混乱。2. 如果安装了最新版本的ie还是发现打印异常,可以尝试切换对应打印机的打印机驱动
Q:在打印之前是不是先写好一个HTML模版再去直接打印就好了?
A: 我们在Chrome等浏览器下预览的HTML模版和实际打印的效果存在一些偏差,需要调用Lodop.PREVIEW()来预览打印效果。
Q:打印表格的时候,当表格内容过多,表格分页的时候最底下的单元格会被截断,怎么办?
A: 在打印表格的时候,尽量调用LODOP.ADD_PRINT_TABLE
,这样在分页的时候会是平滑的。
Q:LODOP.NEWPAGE
和LODOP.NEWPAGEA
这两个接口的区别是什么?
A: LODOP.NEWPAGEA
会在前一个打印页完全完成后(比如报表内容很多导致分页)再分页,而LODOP.NEWPAGE
会直接分页,因此建议使用LODOP.NEWPAGEA
。
Q:有时候发现在某些字段上有重叠打印的情况,是怎么回事?
A:可以检查以下是不是设置了LODOP.SET_PRINT_STYLE('ItemType', 1);
。
Q:在循环里调用LODOP.PRINT()的时候会发现打印任务被分配到了多台打印机?
A:还没去调查过Lodop内部是否有类似负载均衡这样的机制,目前的解决方案是尽量在循环结束之后只调用一次LODOP.PRINT()。