2013第39周一Web打印

时间:2024-01-01 18:52:45
2013第39周一Web打印
项目中遇到了Java Web打印问题,简单调用IE浏览器的打印不能完全满足要求,于是就搜集了Web打印相关的主题,简单汇总一下。web打印难点在分页、页面纸张设置,页眉页脚设置等,感觉ie9本身自带的打印及打印预览功能已基本够用,但低版本ie6下会存在问题;只能调用相关组件来实现,网上有几篇也谈Web打印的文章感觉写的很好,具体做时还可参考。
常见web打印方案实现如下:

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文件的免费组件很多,不用另外花钱。效果也很好。

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

常用免费控件如下:

1、 DLPrinter

这个打印控件完全免费,界面还不错,使用也较为简单,支持打印预览、直接打印、可设置页眉、页脚、页边距、打印份数、纸张大小等信息,悲剧的是这大哥在07年做了第二次更新后就没有后续了,导致在我在ie8下测试的时候,bug不断,更不要说现在流行的ie10,可惜了。

他的博客地址:http://www.cnblogs.com/Yahong111/ 里面有几篇“也谈Web打印”文章写的非常棒,大家可以去学习下。
2、墙外打印控件

墙外打印控件(QWPrint)是一款小巧的打印辅助软件,能够帮助众多制作B/S类程序的程序员更加灵活的控制客户端打印。

注意的是这个控件的2.0是收费版【无视】,以它免费版1.3.8.2为例做了测试。有如下功能:

.小巧轻便,客户端在第一次使用时只要下载一个ActiveX控件即可使用。因为这个控件没有微软的签名,所以做好调整ie安全设置的准备。

.控制多种打印设置。程序员可以通过控件进行多项设置,包括设置打纸的页边距,页眉页脚,纸张大小等参数。

.精确控制打印。可以方便实现web下的套打操作。

.可是它有一个缺点就是无法选择默认打印机,有三、四台打印机的情况下,用户每次打印时必须不断的去选择打印机...这对客户来说是没有办法接受的,所以只好放弃。

3、楚琳Web打印控件
  楚琳Web打印控件是以C/S架构的报表工具进行B/S架构的报表设计,有如下功能:

  .报表功能强大,报表设计采用FastReport,可以和水晶报表媲美,支持自定义纸张大小,支持直接打印。
  .报表设计高效而简单,和C/S架构下的报表设计效率差不多。
  .方便的中国式报表的设计,可以快速而准确设计出报表中的表格线。
  .支持ASP, ASP.NET, PHP, JSP等多开发语言。
  .支持简体中文、英文、繁体中文等多国语言。
  .免费使用,免费版无功能和时间限制。
.这个打印控件偏重于报表打印。

4、 jatoolsPrinter 免费版(强烈推荐):似乎免费版不能商用,没再做具体研究
国内最早的web打印控件,以前有所谓的破解版,jatoolsP.cab,这个免费版,算是这个版本的升级版,可以完美解决原版本jatoolsP.cab中不支持ie9,ie10的问题,有如下功能:

.真正免费,不加水印,没有ip或域名限制,不限时间,带微软数字签名,无限发行,兼容ie6+及ie为内核的浏览器。
.无须注册,下载即用
.设置纸张类型,如A4、A3等
.设置纸张方向(横向、纵向)
.设置页边距
.设置输出打印机
.支持手动分页(按div分页);
.支持直接打印(不显示打印机选择对话框)
.支持打印份数控制
来源: <分享几款免费的web打印控件 - 免费web打印控件 - web - ITeye论坛>

基于web的套打,难度在于要将浏览器中呈现的html,精确地打印到票据中,而且能够实现对分页位置的控制。下面就ie浏览器所能采用的套打解决方案,来个汇总分析,希望对大家有所帮助。

jatoolsPrinter 是一款实现网页套打的免费工具。该工具的特点是可以直接对web页面进行精确的分页打印,这不仅使“会设计网页就会做网页套打”成为可能,也使项目经理们摆脱了预算紧张的压力。jatoolsPrinter通过在网页中嵌入控件,解决了web客户端精确打印,批量打印,打印配置自动保留等问题。jatoolsPrinter 官方正式免费版,支持ie6+,http://printfree.jatools.com

功能特点:
真正免费,不加水印,没有ip或域名限制,不限时间,兼容ie6+
无须注册,下载即用
提供经过微软数字签名的cab自动安装包,安装更方便
长期升级保障,免费论坛支持,让你无后顾之忧
稳定可靠,启动速度远胜同类产品
常用功能集于一身,简约而不简单,软件大小只有84k

本文主要介绍jatoolsPrinter打印控件来完成web的打印功能,这个控件已经把打印功能封装的非常好,主要是把这个控件引入,之后写一些简单的js代码就能完成相应的打印功能。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title></title> <!-- 插入打印控件 --> <object id="jatoolsPrinter" classid="CLSID:B43D3361-D075-4BE2-87FE-057188254255" codebase="jatoolsPrinter.cab#version=5,7,0,0"> </object> <script type="text/javascript"> function
doPrint(how) {

//打印文档对象 var

myDoc = {
                documents: document,   

// 打印页面(div)们在本文档中                copyrights: '杰创软件拥有版权  www.jatools.com' // 版权声明必须

            };

// 调用打印方法 if (how == '打印预览...'

)
                jatoolsPrinter.printPreview(myDoc);  

// 打印预览

else if (how == '打印...'

)
                jatoolsPrinter.print(myDoc,

true);   // 打印前弹出打印设置对话框

else                jatoolsPrinter.print(myDoc, false);       // 不弹出对话框打印

        }

</script></head><body> <form id="form1" runat="server"> <div id='page1' style='width:300px;height:300px;'>

    test

</div> <input type="button" value="打印预览..." onclick="doPrint('打印预览...')"/> <input type="button" value="打印..." onclick="doPrint('打印...')"/> <input type="button" value="打印" onclick="doPrint('打印')"/> </form></body></html>

主要分几个步骤:

一、引入打印控件jatoolsPrinter

<!-- 插入打印控件 --> <object id="jatoolsPrinter" classid="CLSID:B43D3361-D075-4BE2-87FE-057188254255" codebase="jatoolsPrinter.cab#version=5,7,0,0"> </object>

.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }

二、给要打印的div取id名

2013第39周一Web打印

三、编写js代码实现打印div的功能

(注意:在同一页面中,有多个可打印文档,他们可以用page_div_prefix属性来区别page_div_prefix前缀+page+页序号 构成可打印div的id,如前缀为 'report1' ,则找到以 'report1page1'为id的div作为文档首页该属性,默认值为空)

.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }

注意事项:

1. 控件在打印指定div对象时,如果纸张太小不够打印时,超出部分将被截掉(clip)。
2. 被指定的div中的内容,可以是html任何可见对象,图片,flash,或文本等等。
3. 控件打印时,边距可设,不设则取打印机默认值。
4. div的id必须连续,如果你的div,存在 'page1'、'page2'、'page4',而不存在'page3',则控件只打印前两页,'page4'不会被打印。
5. div对象在页面中的位置,可以是随意的,比如,page1显示在page2后面,也是合法的。
6. 指定的div会被打印,没被指定的html元素将不会被打印,比如,本示例中的‘打印’按钮,不会被打印。
7. copyrights属性是版权信息,必须写。