随着软件开发技术逐渐由C/S架构转向B/S架构,打印逐渐成为Web开发人员需要面临的问题。日益强大的CSS样式表技术可以很方便的实现复杂的布局与显示,但由于Web技术对程序的安全沙箱控制,打印的最后一步:输出到打印机却是一个难题。
我们调研了大量Web软件,发现针对Web打印解决方案,主要有如下几种技术实现方式:
通过调用浏览器window对象内置的print方法弹出打印窗口,用户点击确认打印。
这种方式是最简单的打印方法,其最大的问题是需要很大程度人工介入,用户手工需要设定页眉页脚、页边距,以及点击确认打印按钮。这极大地降低了应用的友好度,也无法适应一些高频操作的业务场景。
另一部分开发者采用开发浏览器控件的方式,通过控件连接浏览器的打印SDK并提供Javascript桥接口供网页调用。
早期的代表是在IE浏览器中,JS通过ActiveX技术调用浏览器打印。这种随意调用本地控件的方式被证明为不安全的,同时随着火狐、谷歌等浏览器的兴起,兼容性问题也逐渐凸显。
由于浏览器控件开发技术门槛高,该类产品往往由专业的控件开发商研发并提供有偿使用。
控件很好地解决了交互性的问题。但浏览器控件随操作系统版本、位数、浏览器种类及版本不同,需要开发和维护不同的控件版本,同时主流浏览器的升级速度也十分敏捷,控件开发商往往无法跟上浏览器版本的脚步。此外大部分浏览器往往要求使用C语言开发,若缺乏一个好的内存管理模型,控件经常会因为内存问题而崩溃甚至导致浏览器崩溃。
还有一种方式是在本地安装代理程序,由代理提供Http服务,网页通过跨域的请求技术提交打印任务并接收反馈。
这种方式的好处是脱离了浏览器的约束,避免因浏览器更新带来的版本延迟同步问题。
唯一的问题在于,这种方式需要提示用户下载并安装代理程序。
Strato WebPrinter的核心理念,就是为开发人员提供高度可管理的、极度稳定的、高度自动化的打印解决方案。
经过多方技术调研与分析,我们决定采用第三种方案,即本地代理方式,作为应用场景的核心架构。并采用Java作为代理程序的开发语言,期望通过Java虚拟机技术的跨平台特性,及Java强大的内存管理能力,提供极度稳定的后台服务。
说明:
页面通过JS API未检测到代理程序,提示用户安装;
用户从本地或CDN下载安装程序,并安装;
安装完成后启动代理程序,网页自动检测到代理程序,隐藏提示并切换到正常内容;
用户交互或自动执行JS API发送打印任务;
JS API注册回调函数或监听事件并修改任务状态;
反复运行直至完成打印。