心 涯

NET&JAVA&PHP(要跨界,你不只要跨「脑」的界限,更要跨越「心」的界限,不怕改变,不怕再学习!)

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
       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";
posted on 2007-10-10 22:52  witer666  阅读(540)  评论(1编辑  收藏  举报