Lodop打印方案汇总

Posted by Yeoman on 2017-09-11

目前WMS以及考拉小店系统内的打印方案用的都是客户端打印的方案,借助了Lodop打印控件来完成打印操作。

背景

Q:为什么需要借助Lodop,而不直接用window.print()

A:我们的业务场景有几点是window.print()无法满足的,比如:

  1. 需要无预览界面直接打印
  2. window.print()是采取截屏打印的策略,而我们的业务场景都是大多都是需要自定义HTML模版进行打印。
  3. 我们有云打印的需求,也就是指定一个局域网ip,从指定ip下打印而不是本地打印。

基于以上几点原因,必须要借助打印机控件来完成,而多方了解之后,目前各大公司WMS的打印业务大部分采用的都是Lodop的方案。

Q: Lodop是如何完成上述的这些功能的?

A:我们都知道,浏览器环境对于系统设备的控制能力是比较弱的,或者说浏览器的BOM接口对于设备调用这方面暴露给开发者的功能都是阉割版的,包括摄像头调用,打印机设备调用等等。而如果是CS架构的系统对于设备调用就轻松多了,而Lodop就是浏览器和设备之间的桥梁。我画了一个简单的图,大致代表Lodop的工作方式:

  1. Lodop是一个客户端,需要在打印机主机上安装,运行的时候会起一个http服务。
  2. 浏览器端需要去加载这个http服务上的一个JS文件,这个JS文件中会建立浏览器和Lodop客户端的websocket链接
  3. 浏览器端通过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.NEWPAGELODOP.NEWPAGEA这两个接口的区别是什么?

A: LODOP.NEWPAGEA会在前一个打印页完全完成后(比如报表内容很多导致分页)再分页,而LODOP.NEWPAGE会直接分页,因此建议使用LODOP.NEWPAGEA

Q:有时候发现在某些字段上有重叠打印的情况,是怎么回事?

A:可以检查以下是不是设置了LODOP.SET_PRINT_STYLE('ItemType', 1);

Q:在循环里调用LODOP.PRINT()的时候会发现打印任务被分配到了多台打印机?

A:还没去调查过Lodop内部是否有类似负载均衡这样的机制,目前的解决方案是尽量在循环结束之后只调用一次LODOP.PRINT()。