也谈WEB打印(-):目前的几种方式及我们的任务

     B/S平台下的MIS软件,打印是不可缺少的功能,好的报表输出,能让你的产品在用户的心中增加不少的分量。但是打印模块所花的时间也是非常的多的。其实现方式有如下几种:

1、使用Crystal Report等通用报表组件来完成。

   优点:功能强大,对于CS/BS都可以通用,Crystal Report等甚至与还有Report Service等功能,对于业务流程非常复杂的大项目应该是很适合的了。这种项目人手充足,时间充足,资金也充足,老板也重视。(这是个人猜测,因为我没做过大项目^_^)。

  缺点:工作量大,对每一个报表都需要设计模板,这个需要花费不少的时间和精力。我们这种小项目,流程不复杂,Report Service等功能用不上,也不用CS/BS通用,也许将来某个时候需要需要在C/S下用,但还不知道那是什么时候。就是需要控制页边距、纸张大小等,然后把当前界面或者某个报表(很少的情况)打印出来就可以了。另外,我们因为项目小,所以项目成员也少,也就5~6个人,项目的开发周期也短,也就2~3个月,如果还需要抽出人手来专门做报表模板,还真有点紧张。看着兄弟们加班加点,还真不忍心再加大工作量。还有一个最要命的是,这些东西真的贵。资金本来就少,还需要买这些服务,一谈起这个事情,老板总是摇头。

2、使用IE自带的打印功能,加上CSS的支持。

   优点:不用专人花时间来写打印模板,节省时间,也不要另外花钱,老板很高兴。似乎是一个好的方案。

缺点:功能太弱小了。不能控制页边距、纸张大小等,更不用说不打印当前界面而是打印另外一个报表了。这样,客户就不高兴了,干嘛非得每次让我自己设置页边距、设置纸张大小、设置页眉页脚等,或者是有些报表根本就没有提供。

3、使用meadroid等提供的免费客户端打印组件。

   优点:同2

   缺点:meadroid的这个东西很好,可惜只能使用半年。半年之后你必须重新下载,并更改该组件的GUID,真麻烦。如果用户这个时候正好需要打印,那真是臭大了。而且,如果你想避免这种情况的发生,那就请交钱吧,即使是1年的费用好像也不便宜。这样的话,我们似乎又回到了第一个解决方案。当然还有许多其他公司提供的免费组件,但是性质和meadroid公司提供的都差不多,费用有便宜的,也有贵的,总的说来,老板都总是摇头。

4、使用服务器端生成PDF等文件的方式。

    优点:现在生成PDF文件的免费组件很多,不用另外花钱。效果也很好。

缺点:学习困难。代码量也非常大。而且,对于我们这种需求多变的小项目,一旦客户的要求变了,那么就必须相应的更改代码。维护的代价真的高。

看了这么几种方案,都不适合我们使用。还是毛主席老人家讲得好,“自己动手,丰衣足食”,看来得自己动手写一个IE客户端打印组件了,他实现如下功能:

1、 可以用js控制页边距、纸张大小、页眉页脚、横向纵向等。

2、 可以用js控制打印内容。

找了几天的资料,终于找到了2篇好文:《Beyond Print Preview: Print Customization for Internet Explorer 5.5、《Print Preview 2: The Continuing Adventures of Internet Explorer 5.5 Print Customization》。看了半天,终于摸出了一点头绪,在那个Sample的基础上改了改,做了个ActiveX,现供朋友们使用。可以用js控制页边距,设置当前打印的URL,至于纸张大小,页眉页脚等功能,容我实现后再提供给朋友们使用。至于源码,因涉及公司机密,所以……请朋友们见谅。

使用方法:

1、首先在被打印页面中包含如下语句:

<OBJECT ID="DLPrinter" CLASSID="CLSID:5C230622-45E5-4e3c-893C-3BFDDC4DB5E4" height="0" width="0" codebase="DLPrinter.CAB" ></OBJECT>

2、打印预览:<input type="button" id="btnPrint" value="Print Preview" onclick="DLPrinter.PrintPreview()" />

3、设置页边距:

 DLPrinter.MarginLeft=20; //这是毫米制的

 DLPrinter.MarginRight=20;

 DLPrinter.MarginTop=20;

 DLPrinter.MarginBottom=20;

4、不打印当前页面而是另外一个页面:

DLPrinter.ContentURL="http://www.cnblogs.com/Yahong111/archive/2007/09/19/898326.html";

在后续的文章中,我会讲述是如何实现这些功能的。欢迎拍砖。
    DLPrinter.CAB.rar,大家把扩展名.rar去掉即可(因为不能上传.cab文件,所以把DLPrinter.cab改成了DLPrinter.cab.rar)。

posted @ 2007-10-08 16:06 永红 阅读(4884) 评论(44)  编辑 收藏 网摘 所属分类: WEB打印

  回复  引用  查看    
#1楼 2007-10-08 16:25 | 一味      
以前是做C/S项目的,没有意识到Web打印的痛苦,经过了两个项目的摧残,一直都是用的ActiveX做的打印,在服务器端写js控制active组件实现打印,优点是容易控制复杂的报表情况,缺点是代码量太大,一个简单的报表也需要大约1个工作日。
  回复  引用    
#2楼 2007-10-08 16:32 | roseangel [未注册用户]
期待ing....
  回复  引用  查看    
#3楼 [楼主]2007-10-08 16:36 | 永红      
@一味
是啊,我以前也一直是做CS项目的。WEB打印真的是很痛苦。我现在就是想做一个能够配合CSS,JS,XML,能够在客户端控制用JS灵活控制页面设置上的各种操作,例如页边距,页眉、页脚,横向/纵向。或者打印与当前页面相关的一个另外的页面。
  回复  引用  查看    
#4楼 2007-10-08 16:46 | 老Q      
还有一种方式,也是比较好的,excel表,可以预览,打印表头。
代码量也不大,
制作也简单,设计模板,填充单元格。做一张表估计在1个小时就够了。
而且可以做任何样式的(中国报表太复杂,尤其是政府报表)
  回复  引用    
#5楼 2007-10-08 17:12 | =idzi= [未注册用户]
这样看来代码量也不见得小多少……不过确实是一个好的解决方案……期待后续……
  回复  引用  查看    
#6楼 2007-10-08 17:25 | henry      
  回复  引用    
#7楼 2007-10-08 18:18 | aeroastro [未注册用户]
非常感谢收益非浅
  回复  引用  查看    
#8楼 2007-10-08 20:23 | 金色海洋(jyk)      
好文
webprint 用过了吗?
  回复  引用  查看    
#9楼 2007-10-08 20:42 | Cure      
做成ActiveX,那是不是客户的浏览器还要允许运行ActiveX控件才行?
  回复  引用  查看    
#10楼 2007-10-08 20:43 | Cure      
@老Q
用Excel最头疼的是Detail部分需要重复很多次的表格,处理起来挺麻烦
  回复  引用  查看    
#11楼 [楼主]2007-10-08 21:54 | 永红      
@老Q
用Excel在处理图片等方面不是很方便,另外,如果我们的页面已经做好了,如果能够直接打印,那就是最好的解决方案,这样可以节省很多时间的。
  回复  引用  查看    
#12楼 [楼主]2007-10-08 21:55 | 永红      
@Cure
需要允许ActiveX控件运行
  回复  引用  查看    
#13楼 [楼主]2007-10-08 22:04 | 永红      
@金色海洋(jyk)
没有用过,不过好像是需要Money的(记不清楚了)。
^_^
  回复  引用  查看    
#14楼 2007-10-09 08:15 | BlackCat      
写个Sample出来,哈哈
  回复  引用  查看    
#17楼 2007-10-09 09:16 | Leem      
想知道控件是用什么开发的,VB?
  回复  引用    
#18楼 2007-10-09 09:55 | holged [未注册用户]
很不錯,正在找相關組件,
雖然"因涉及公司机密,所以……请朋友们见谅。"
還是偷偷問一下,可否......。
如果可以,holged#163.com。
  回复  引用  查看    
#19楼 2007-10-09 11:46 | Clark Zheng      
报表这东西自降生以来,每个毛孔就带着钱和肮脏的东西。。。
  回复  引用  查看    
#20楼 2007-10-09 12:40 | web报表      
和我们做的webprint思路差不多,不过多年前我们就做好了.
  回复  引用  查看    
#21楼 [楼主]2007-10-09 12:47 | 永红      
@web报表
E表是不错,可惜我们公司小,老板也小气。没法了。就只有自己搞了。^_^
  回复  引用  查看    
#22楼 [楼主]2007-10-09 12:48 | 永红      
@Leem
是用VC做的。唉,好多年没有用过VC了,又得重头再来。
  回复  引用  查看    
#23楼 2007-10-10 21:46 | 飞地      
为什么任务栏是乱码
  回复  引用  查看    
#24楼 [楼主]2007-10-10 21:53 | 永红      
@飞地
可以详细讲一下么?
  回复  引用  查看    
#25楼 [楼主]2007-10-10 21:55 | 永红      
@飞地
估计是IE的编码设置有问题。请手工设为正确的编码。
我会在更新版本中解决这个问题。
  回复  引用    
#26楼 2007-10-11 04:54 | peterchen [未注册用户]
是C#还是VB?
  回复  引用  查看    
#27楼 [楼主]2007-10-11 08:25 | 永红      
@peterchen
不清楚你所说的,能否在详细一点?

  回复  引用    
#28楼 2007-10-11 14:15 | gzj [未注册用户]
如果客户端装access. 用access作也很好。
  回复  引用    
#29楼 2007-10-11 14:17 | gzj [未注册用户]
如果客户端装access. 用access作也很好。
(服务器端直接产生acess文件,下载到客户端) 工作量很小,修改起来也
方便。
  回复  引用  查看    
#30楼 [楼主]2007-10-11 14:48 | 永红      
@gzj
用ACESS至少不可以直接打印当前页面,需要另外写代码。
  回复  引用  查看    
#31楼 2007-10-11 21:11 | 飞地      
@永红
昨天看的时候也有切换编码,没有看到效果,今天OK了.
发现我的测试Solution是utf-8编码.你的控件里面取的是默认gb2312码,
所以出现这种问题.
谢谢提供这样好的东东!
  回复  引用  查看    
#32楼 [楼主]2007-10-11 21:28 | 永红      
@飞地
不用客气。原来在网上找了好久的免费版,总是找不到,其实这个东西的技术含量并不高,可许多人就是这么小气。现在放一个免费的,方便人家,也方便自己。再讲一下原理,也好大家能够一起提高。
  回复  引用    
#33楼 2007-10-16 15:51 | 忍 [未注册用户]
请教一下,我按上面试了下,不行,报JS错误,说是对"对象不支持此属性或方法",怎么回事??

代码如下:<head runat="server">
<title>无标题页</title>
<OBJECT ID="DLPrinter" CLASSID="CLSID:5C230622-45E5-4e3c-893C-3BFDDC4DB5E4" height="0" width="0" codebase="DLPrinter.cab" ></OBJECT>
</head>

<body>
<form id="form1" runat="server">
<div>
<input type="button" id="btnPrint" value="Print Preview" onclick="DLPrinter.PrintPreview()" />
</div>
</form>
</body
  回复  引用  查看    
#34楼 [楼主]2007-10-16 17:54 | 永红      
@忍
必须把DLPrinter.cab文件放入和HTML文件相同的文件夹。
如果还不行的话,请按如下步骤进行:
1、删除注册表中HKEY_CLASS_ROOT\CLSID\{5C230622-45E5-4e3c-893C-3BFDDC4DB5E4}”的注册表项;
2、下载http://www.cnblogs.com/Files/Yahong111/sampledesc.rar
3、解压缩,然后打开其中的sampledesc.htm文件;
4、IE会提示禁止了其中的一些内容,单击该提示,然后选择“允许被阻止的内容”;
5、过一会,IE会提示“是否下载并安装不信任的ActiveX组件”,单击是。
6、单击最下方的Print Preview按钮,应该就可以看到效果。

其中,如果不进行第4步的话,就不会报错,也不会有显示。如果不进行第5步的话,就会报错。

  回复  引用    
#35楼 2007-10-17 09:15 | 忍 [未注册用户]
我DLPrinter.cab与HTML文件放在同个文件夹了,还是有JS错误.然后去删除注册表,我在注册表中,没有找到这个HKEY_CLASS_ROOT\CLSID\{5C230622-45E5-4e3c-893C-3BFDDC4DB5E4}”,只找到了
HKEY_CURRENT_USER/Software/Microsoft/Windows/Ext/Stats{5C230622-45E5-4E3C-893C-3BFDDC4DB5E4}

请教怎么办了??


  回复  引用    
#36楼 2007-10-17 09:27 | 忍 [未注册用户]
急.. 我下载了下载http://www.cnblogs.com/Files/Yahong111/sampledesc.rar; 打开那个sampledesc.htm时,然后选择“允许被阻止的内容”,就弹出"Windows 已经阻止此软件因为无法验证发行者"提示框, 请问怎么解决了????
  回复  引用  查看    
#37楼 [楼主]2007-10-17 11:14 | 永红      
@忍
需要调整IE的安全性,请将IE的安全级别调整为允许“提示下载未经签名的Activex控件”。
  回复  引用  查看    
#38楼 [楼主]2007-10-17 11:14 | 永红      
@忍
这个说明ActiveX控件没有被正确的注册,请将IE的安全性调低。
  回复  引用    
#39楼 2007-10-17 14:56 | 忍 [未注册用户]
吖,终于看到效果了,不错,太谢谢了,我写下面样子就可以了 <OBJECT ID="DLPrinter" CLASSID="CLSID:5C230622-45E5-4e3c-893C-3BFDDC4DB5E4" height="0" width="0" codebase="DLPrinter.cab/DLPrinter.dll" ></OBJECT>

谢谢楼上的回复... :)
  回复  引用  查看    
#40楼 [楼主]2007-10-17 15:49 | 永红      
@忍
^_^。
谢谢关注。
  回复  引用    
#41楼 2007-12-01 01:23 | Jeremy 王 [未注册用户]
如何打印当前页面中的某个控件中的内容.
比如说:打印当前页面中gridview中的内容。ContentURL好像只能固定内容?

  回复  引用    
#42楼 2008-08-07 10:22 | royan [未注册用户]
在模式窗口下会出错
  回复  引用    
#43楼 2008-12-01 10:46 | lly [未注册用户]
jatools 也可以用在1.2.6及以前的都免费

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索
[推荐职位]上海盛大网络招聘架构师



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: