落幕之舞的gl小说:web报表开发技术专题六:尴尬的Web打印

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 00:45:42
       自从电脑被发明以来,将电脑中的内容打印出来是自然而然的需求。进入互联网时代后便更是如此。但要想完美地实现Web打印功能却并非易事,甚至于根本都不可能彻底地解决好这个问题。

      记得很早以前田荣举(注:田荣举现任金蝶集团高级副总裁兼任首席技术官)和我私下聊过:“打印功能要占到整个系统开发量的两成”。打印功能是一个系统开发的重要组成部分。中国人历来好面子,往往要求有漂亮的打印,以显露科技之高深。打印功能对于web报表工具来说就更是不可或缺的了。

      因为打印功能的重要性,所以进入web开发后,很快就开始关注web打印功能的开发了,web打印有下面的相关问题需要考虑清楚:

1 在客户端还是服务器端打印?考虑到数据传递到客户端的速度问题,在服务器端做大数据量的打印还是不错的选择。但在后台打印必竟很不方便,所以主要还是要在客户端打印,即利用客户端的打印机打印。

2 是导出为PDF或EXCEL文件后打印还是直接打印?将要打印的内容生成为PDF或EXCEL文件后再打印,这也是一种方式,这种方式实际上也就几乎不需要专门考虑打印功能的开发了,开发工作量少。但其缺点也很明显:需要客户端安装打开PDF的软件(或EXCEL软件),需要在另一个软件中打印,步骤多,无法实现点击后直接打印,这种打印模式也无法实现某个单据是否打印了要当作一个标志保存起来的场合。

3 是利用IE的打印还是自己实现打印?如果打印功能全部由自己实现,因为要处理数据,样式,位置,图片等的打印,自然程序量小不了,往往会使第一次的下载量很大。而且往打印控件中传递要打印的数据的过程会比较复杂而且慢。

4 第一次打印时需不需要下载ActiveX控件?如果不需要,则无法用javascript脚本程序控制客户端的打印机,无法自定义纸张,无法不弹出打印对话框就直接打印。也就是说,最终用户在每次打印时都要手工选择好打印参数(如打印方向,纸张大小等),这样显然会使最终用户的操作比较麻烦。

      最开始我是设想直接用javascript脚本来计算分页,直接利用IE中的打印机制来解决打印问题。后来随着IE的版本升级,安全机制不断完善。在不下载ActiveX插件的情况下,IE的安全机制是不可能让你用javascript脚本来全面控制客户端的打印机的。试想如果这样的话就有可能浏览网上的某个网页时,你连接的打印机就自动开始打印东西了。也就是说,要想弄好Web打印,必须要在客户端下载插件。在中国流氓插件泛滥的情况下,大家一看到插件都怕了。要不就要下载插件,要不打印就不太方便。这成了web打印的死结。且觉得一样子无法解开,真是尴尬的Web打印。

      既然最佳的方式是无解的,哪就退而求其次吧。用一个小的轻量级的activeX控件来控制客户端的打印机吧,这样第一次下载这个activeX控件是也不会很慢。

      记得以前在卖web打印控件时,有一用户将scriptx的网站告诉我,说要能实现这样的功能就买。于是便开始研究起scriptx来。按照我以前用visual c++编程的经验,觉得大体就是用钩子函数来实现。结合IE的打印模版技术,终于基本上达到了。用visual c++的ATL(为了减少字节而没有用MFC)做了一个webprint.dll,这个webprint.dll压缩成cab文件后只有75K,和一个网页的大小相当。这样在第一次下载时便不会太慢了。因为真正的打印机制还是调用IE内部的,并没有在webprint.dll里面实现具体的打印功能,所以就不需要将要打印的内容传递到webprint.dll中,这是区别于其它用activex控件实现web打印的重要一点。如果靠activex控件来实现全部的打印功能的话,就必然要求要将打印的内容传递到activex控件中,这个传递的过程会比较麻烦而且速度也慢。Webprint.dll只完成向IE的内部实现的打印功能模块传递打印的基本参数(如:页面大小,页边距,打印方向,直接打印),网页上显示什么内容就打印什么内容,没有向webprint.dll传递打印内容的过程。如下图所示的打印预览界面图:

      实际上,打印的需求很简单,无非就是:分页,页眉页脚,页边距,打印方向,自定义纸张,直接打印,弹出打印对话框再打印,预览,放缩打印,成批打印,套打等功能,打印的需求很固定,明确而且通用。将一个多页的报表一页页地打印出来这样一个简单的需求,在网页上却相当麻烦,我也是在不久前才将它在e表中算是比较理想的实现了,即可以象cs程序一样,点一下按钮,就将多页的报表一页页地打印出来。这其中要考虑到在互联网上从服务器端向客户端传递大量数据时的分页处理,以及打印了一页数据再传递另一页数据的问题。因为如将要打印的多页内容一次从服务器端全部发送到客户端的话,在当今互联网的条件下很可能会因速度慢而受不了。只能每次从服务器端发送一页数据到客户端,打印,然后再发送下一页数据到客户端,再打印,如此下去直至打印结束。这一点也是web打印比c/s程序的打印要麻烦的地方。

      总之,Web打印问题已经和浏览网页速度慢的问题一样,成为Web程序的难题之一。只能作一些权衡。比如象国外因为PDF查看工具的流行,大多选择生成PDF文件后再打印的方式。我研究Web打印解决方案多年,最终采用的轻量级的ActiveX控件的Web打印方案,是我现在认为最适合中国国情的方案。也许以后还能找到更好的。