什么是LODOP
LODOP是BS架构打印的解决方案,支持绝大多数浏览器,如果网站上有打印的需求,推荐使用该工具进行打印。
选择LODOP的原因不仅仅在于其对于web打印有着比原生打印更好的打印体验,主要是其还提供了丰富的API,让开发者可以访问打印任务的状态以及打印机的状态,设置打印机与打印输出的属性等等,让开发者可以通过这些实现更多的用户需求。
另外看了官网云打印,之前一直以为必须安装控件才能打印,所以应该是对于设备和系统有要求,但是目前来看也是不限制的,甚至可以使用移动端发送打印请求,但是我没有这方面的使用需求,这里仅仅讨论Windows平台下的打印使用经验。
LODOP安装使用
在官网里下载中心中我们可以下载到打印控件(产品下载)与JS调用打印控件的API(技术手册),并且产品下载的内容包含测试的样例。
因为官方给的例子中已经有详细的安装以及使用说明,所以这里不做赘述,可以进入下载中心下载解压后直接查看样例,样例1就是安装以及基本的使用说明,其他的样例是一些常见的使用场景。
强烈建议加入售后群,LODOP的售后人员回答问题都很专业且及时,有很好的售后体验。如果使用时发现了以上测试用例之外的使用场景,或者发现一些使用问题,基本都能在技术人员那里得到优质的反馈。
打印场景说明
使用LODOP打印应该也有两年多了,主要用于条码打印/检验报告单/报表,这里简单聊以下我的使用场景。
条码打印
因为系统架构是BS的,早期使用ScriptX进行打印主要有这么几个痛点:
- 打印Html内容格式很难固定,需要设置条码打印机来控制纸张大小,而且这个过程非常繁琐,经常出现问题;
- 不能跨浏览器,只能支持IE浏览器,而且一般需要开启兼容模式并添加受信任站点;
- 如果需要设置打印场景的默认打印机,需要读取注册表来读取当前系统的打印机,这也是浏览器不兼容的一个主要问题;
- 不弹出提示直接执行打印任务可能需要安装一些打印控件,但是这些打印控件安装繁琐,且部分系统支持有限;
- 分页是个问题,内容一旦溢出,即使设置了打印纸张也没用;
- 条码输出需要后端来支持,生成图片;
当然以上只是一部分,但是实际在没有LODOP前打印体验还更差,工程实施与运维在这里踩出过很多坑,而且很多问题会和打印环境也就是电脑系统/IE版本有关,出现问题也很难排查。
因为有打印条形码的需求,并且不想使用后端来生成条形码图片,所以这里我不推荐全部使用HTML设置打印内容。文本建议使用ADD_PRINT_TEXT
或ADD_PRINT_TEXTA
,区别是后者可以可以针对性的设置打印样式。条码输出建议使用ADD_PRINT_BARCODE
。
因为LODOP没有提供直接适用于浏览器的样式设置工具,所以建议自己配置一个模块维护样式。(样例中有使用设置工具生成模板的例子,但是不够相对来说不够直观)。
我这边的设计是BarcodeDesign(条码样式设计表)、BarcodeDesignDetail(条码样式设计明细表)、BarcodeDesignDetailStyle(条码样式设计明细样式表)。
BarcodeDesign是主表,控制打印的基本样式,维护基本的信息主要是样式名称、打印纸张大小、打印方向、样式说明等。
BarcodeDesignDetail是BarcodeDesign的从表,用于维护打印的具体内容,例如数据源、类型(条形码、文本、图片、图形、HTML内容、分页符等LODOP支持输出的格式)、顺序(结合类型中的分页符实现分页效果)等、内容的位置信息和宽高。
BarcodeDesignDetailStyle是BarcodeDesignDetail的从表,用于维护打印内容的样式信息,也就是SET_PRINT_STYLEA可以针对不同的内容类型设置的样式。
检验报告
检验报告单的打印,相对条码打印要复杂很多,因为基本样式是不固定的。公司在前期没有考虑用报表控件,开始是xsl输出,因为学习成本较高不利于维护,后面改用Html打印,除常见格式外,余下的每种报告单样式对应一个页面。
开始没有考虑FastReport是因为BS架构下兼容有问题,加上报告单的样式比较复杂,数据源比较复杂,分页/数据表设计/排版 在这些报表控件中很难设计出理想的效果,另外就是报表控件设计工具的使用对于我来说也有一定的学习成本,所以基于此干脆继续使用Html打印,而这恰好也是LODOP最擅长的。
设计主要就两个表:LabReportDesign(实验室检验报告单设计表)与LabReportDesignDetail(实验室检验报告单设计明细表)。
LabReportDesign是主表,主要用来配置报告单的基本信息,包括报告单名称、打印纸张信息、输出内容的宽度与边距、使用的字体大小与样式、是否使用特殊样式(默认走普通样式)、每页显示的数据行数等等。
LabReportDesignDetail是LabReportDesign的从表,主要用于配置一些基础的数据源信息,包括行头展示的病人与检验信息/页脚展示的病人与检验信息/报告单主题内容显示哪些结果信息/注脚显示的信息等。
这里如果是普通报告单,从以上两张表的设置,可以从后台拼接一份Html用于打印。
如果是特殊样式的报告单,这里也没有考虑使用页面,一方面不方便打印,另外就是考虑到检验医师签名后要将数据静态化到数据表中,供其他系统查阅,这里使用的Razor引擎解析指定目录下的cshtml
文件,这里是可以返回一份Html内容的。
另外将Html内容静态化的另外一个好处就是,我们还可以使用一些工具例如wkhtmltopdf
将文件生成PDF文件。
报表
普通报表打印输出问题不大,问题是一些报表的某些数据列,内容长度变化较大不方便分页,之前设计的打印都是每一页固定行数,就会出现某些内容打印超出纸张,某些内容只占了纸张的一半。
这里建议参考一下样例中数据表格分页打印的样例,但是需要注意的是表格数据内容较多时,打印控件进行数据装载的时间会比较长。
优缺点
优点:
- BS架构实现CS架构下的打印体验,这一点是目前市面上打印控件做的最好的;
- 浏览器兼容性较好,支持现代浏览器;
- 样例完善,基本覆盖所有的打印场景;
- 售后技术人员反馈回复及时,回复内容也比较专业;
- 价格方面比较友好;
缺点:
- 打印依赖IE浏览器解析,LODOP客户端或CLODOP服务端IE浏览器版本较低可能会出现一些问题;
- 目前设计功能开发还不够,需要进一步完善;
- 仅仅适用于打印样式比较简单的场景;
- 如果需要将内容输出为PDF等格式文档文件可能需要依赖虚拟打印机等;
注意事项
- 打印的Html内容如果需要加载媒体资源例如图片,建议通过
SET_PRINT_STYLEA
设置HtmWaitMilSecs
即超文本下载延迟,避免图片没有下载完成即执行打印; - 尽量避免打印内容的媒体资源,例如图片
404
,否则可能出现任务响应缓慢; - 打印Html内容一定要检查内容开闭标签是否有缺失,否则可能出现很奇怪的问题;
- 打印Html内容如果是外联样式,并且要使用该样式,注意打印的时候要加入到打印内容中;