Web打印 / 报表

http://www.cnblogs.com/webreport/archive/2007/07/23/828512.html
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打印方案,是我现在认为最适合中国国情的方案。也许以后还能找到更好的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
控件功能强大,却简单易用,所有调用如同JavaScript扩展语句, 主要接口函数如下: PRINT_INIT 打印初始化 SET_PRINT_PAGESIZE 设定纸张大小 ADD_PRINT_HTM 增加超文本项 ADD_PRINT_TEXT 增加纯文本项 ADD_PRINT_TABLE 增加表格项 ADD_PRINT_SHAPE 画图形 SET_PRINT_STYLE 设置对象风格 PREVIEW 打印预览 PRINT 直接打印 PRINT_SETUP 打印维护 PRINT_DESIGN 打印设计 ... 样例清单 1.如何在页面内嵌入控件见样例一 2.如何选材打印当前页面内容见样例二 3.如何用代码生成打印页见样例三 4.如何打印设计和定位套打见样例四 5.如何控制纸张大小和连续打印见样例五 6.如何输出多页长文档及双面打印见样例六 7.如何定向输出见样例七 8.如何打印图片见样例八 9.如何用程序加载打印维护背景图见样例九 10.如何控制打印样式(STYLE)见样例十 11.如何直接打印条形码见样例十一 12.如何读写本地文件见样例十二 13.如何打印旋转内容见样例十三 14.如何按URL打印见样例十四 15.如何打印表格的页头页尾见样例十五 16.如何设置预览窗口大小见样例十六 17.如何发打印机指令或直接读写端口见样例十七 18.如何打印幅面高度不固定的票据见样例十八 19.如何内嵌显示及预览时包含背景图见样例十九 20.如何强制分页并预览多页卡片见样例二十 21.如何控制打印维护的功能权限见样例二十一 22.如何构建自己的纯WEB打印预览见样例二十二 23.如何居中打印超文本见样例二十三 24.如何选择界面皮肤见样例二十四 25.如何指定输出到哪页或仅预览见样例二十五 26.如何提高多页打印的性能见样例二十六 27.如何导出数据到Excel文件见样例二十七 28.如何快速读取客户端系统信息见样例二十八 29.如何使用其它长度单位见样例二十九 30.如何分页输出页面内容见样例三十 31.如何打印表格的分页小计或合计见样例三十一 32.如何实现清晰的图表打印见样例三十二 33.如何实现甘特图等的图表打印见样例三十三 34.如何使用百分比%和满页打印见样例三十四 35.如何获得打印结果和程序代码见样例三十五 36.如何在设计过程中用js编辑内容见样例三十六 37.如何打印公章效果图见样例三十七 38.如何用BASE64编码输出图片见样例三十八 39.如何打印田字格、上划线等文本见样例三十九 40.如何进行数据格式转换见样例四十 41.如何把内容关联后按顺序打印见样例四十一 42.如何把整页内容缩放打印见样例四十二 43.如何分页打印综合表格见样例四十三 44.如何缩放打印单个超文本内容见样例四十四 45.如何获得打印状态及最终结果见样例四十五 46.如何设置右边距和下边距见样例四十六
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值