岁月如哥
人生非梦
posts - 50,comments - 144,trackbacks - 0

做管理系统的时候,打印一直是个棘手的问题,做B/S的系统这个问题就更加突出了!下面举出三种常用的web打印处理方式

1、利用word或者excel来实现web打印(如果不修改ie设置,可以在web服务器端生成xls文件,然后通过xlBook = xls.Workbooks.Open(remotePath) 获取对象打印

   实现过程:先将需要打印的数据导入到word或者excel中,再利用word或者excel的打印功能来实现web打印。
   下面以excel为例实现如何打印的过程
   将网页中数据导入excel中的方法有很多,这里先介绍一种,利用ActiveX控件的方式,即 Excel.Application, 这个控件是MS为excel提供的编程接口,在很多种编程语言种都可以通过该接口来操纵excel表格。
   下面用javascript脚本来实现一个简单的例子。
< script language="javascript">

function ExcelPrint(){

var excelApp;//存放Excel对象

var excelBook;//存放Excel工件簿文件

var excelSheet;//存放Excel活动工作表

try{

excelApp = new ActiveXObject("Excel. Application");//创建Excel对象}

catch(e){

alert("请启用ActiveX控件设置!");

return;}

excelBook = excelApp.Workbooks.Add();//创建Excel工作簿文件

excelSheet = excelBook.ActiveSheet;//激活Excel工作表

var rowLen = printTable.rows.length;//table对象的行数

for (var i=0;i< rowLen;i++){

var colLen = printTable.rows(i).cells.length;//table对象的列数

for (var j=0;j< colLen;j++)//为Excel表的单元格赋值

excelSheet.Cells(i+1,j+1).value = printTable.rows(i).cells(j).innerText;} //将表格中的每个单元格的innerText导入到excel的单元格中

excelApp.Visible = true;//设置Excel对象可见}

excelSheet.PrintOut(); //打印工作表

excelBook.Close(true); //关闭文档

excelApp.Quit(); //结束excel对象

excelApp=null;  //释放excel对象

 

< /script>
  
   注意:
   运行该程序的前提是 IE要允许对没有标记为安全的Activex控件进行初始化和脚本运行。设置方法如下:
   打开控制面板→Internet选项→安全性→自定义级别→对没有标记为安全的ActiveX控件进行初始化和脚本运行→选中启用,这样我们的程序就可以运行了。如果没有启用该ActiveX控件设置,那么程序在执行创建Excel对象时会抛出一个异常,这时可以通过catch()语句来捕获这个异常,并且做出相应的处理。
   运行该程序必须客户端安装了MS EXCEL,否则Activex驱动不了。
  
  
  
2、利用浏览器自带的打印控件来实现web打印
   实现过程:直接调用IE的打印功能或者在程序中调用window.print()来实现web打印,页眉和页脚会有网页标题、页码、网址,日期等信息,这些打印时如果不需要,怎样能去掉呢。做法其实很简单,只有在IE的文件菜单中打开页码设置对话框,去掉页眉页脚中设置的哪些信息,就可以了。但是这需要每个客户端都去手动设置一次。如果不想让每个客户端都手动去设置一次,也可以用代码通过修改注册表的键值来实现。
   下面是用VBScript来实现的修改注册表的过程:
   < script language="VBScript">

dim path, reg

'path存放IE打印设置的注册表地址, reg存放WScript.Shell组件的对象

path = "HKEY_CURRENT_USER\Software\Micro-soft\Internet Explorer\PageSetup"

'通过注册表修改打印设置,只修改页眉、页脚和各边界的值

'参数说明:header--页眉,footer--页脚,margin_left--左边界

'margin_top--上边界,margin_right--右边界,margin_bottom--下边界

'页边距的设置中 1对应25.4mm,即margin_left=1表示实际值的25.4mm

function pagesetup(header, footer, margin_left, margin_top, margin_right, margin_bottom)

On Error Resume Next

Set reg = CreateObject("WScript.Shell")

if err.Number>0 then

MsgBox "不能创建WScript.Shell对象!"

exit function

end if

reg.RegWrite path+"\header", header'设置页眉

reg.RegWrite path+"\footer", footer '设置页脚

reg.RegWrite path+"\margin_left", margin_left'设置左边界

reg.RegWrite path+"\margin_top", margin_top'设置上边界

reg.RegWrite path+"\margin_right", margin_right'设置右边界

reg.RegWrite path+"\margin_bottom", margin_bottom'设置下边界

end function

< /script>

还有一点需要注意的是,利用window.print()这样的方法来打印,是直接弹出打印对话框,而不是打印预览的窗口。一般来说用户希望先打印预览一下,然后再打印。或者有的格式固定的,每次都是一样的格式,就希望不弹出打印对话框,直接就打印出来。
还有的用户希望每个打印都是直接和一种纸张绑定好,打印时候直接就调用那种类型的纸张来打印,这样window.print()显然远远不够。


3、利用第三方的控件或者报表软件来实现web打印
   实现过程:第三方控件将打印的参数和方法封装成对象,在页面中可以方便的直接调用,例如ScriptX.cab,eprint.cab 都是这种类型的控件。可以直接用代码实现web打印页眉页脚的设置,web打印纸张的绑定,web打印边距的设置,web打印预览,直接web打印。
   web打印格式设置,web打印分页,web打印换页重新打印某些信息,某些信息只能第一页打印,某些信息只能最后一页打印等等这些,也都解决方案。Scriptx没有处理这些的方案,webprint有webgrid和eprint两种解决方案,行列规则的表格式的可以简单webgrid来处理,复杂格式的可以用eprint来设计格式。
  
   一般这种类型的打印控件都是需要收费的,用户可以从经济的角度来考虑。
==========================================================================================================

一、 浏览器的打印功能菜单
这种方案的优势是不需要对浏览器作任何扩充,是最简单的办法,但问题也最多,如:
  1. 不能精确分页。
    浏览器一般是根据用户设置的页面大小,web页面的内容多少,来自行决定分页位置,程序员很难控制。会有页脚页眉干扰。
  2. 不能准确对齐边边距及打印文字。
  3. 不能解决连续打印。
    比如,不是仅打印一张票据,而是连续一次打印若干个票据。
二、 使用webbrowser控件+ javascript
这实际上,是浏览器打印功能菜单的一种程序调用,与打印功能菜单没什么两样。分页的问题仍然存在,只不过,可以让用户不用去点菜单,直接在网页中的一个按钮,或一个链接里面调用罢了。

三、 使用print css
这是一种最理想的实现web套打的方法。这种方法通过在html文档中,嵌入打印相关的css样式,来实现对html文档输出打印的控制,比如设置纸张大小,纸张纵横方向,打印边距,分页等。显而易见,这种方式成本小,不需要下载任何插件,而且跨平台性非常好。print css推出已经有些时日,但遗憾的是,至今没有一个厂商的浏览器很好地实现了这些标准,这使得程序员目前还不能利用print css进行实际的开发。关于打印css,参见:
http://css-discuss.incutio.com/?page=PrintStylesheets

四、 使用pdf文件
用这种方式,就是从服务器端下载一个pdf文件流,在IE中用adobe插件打开,然后用adobe的打印菜单进行打印,虽然这种方案,也能实现精确套打,但需要下载adobe插件。这是国外报表工具经常推荐的一种打印方法,但在pdf不那么普及的中国,这种方案不是最好选择。

五、 采用纯ActiveX
这种方案就是下载一个控件,票据的数据不再以html方式呈现,而是呈现在ActiveX中。这种方案的优点是打印的精确度高,分页的可控性好,但缺点也是很明显的,嵌入ActiveX控件破坏了web应用的整体html风格,且这样的控件比较大(一般超过1M,下载颇费时间)。市场上的非java类报表产品,一般都采用这种方案。

六、 采用Applet方式
采用Applet方式,分页或精确打印,都可以做到完美,但缺点也很明显,表现在:

  1. 安装Applet成本巨大。需要下载十几M的文件。
    Applet本身可能并不大,但运行Applet所需的jre一般至少10几M(jre1.4.2 , 15.45M)。用户需要极大的耐心,来进行打印。
  2. 打印报表时,需要重新向服务器检索数据,效率低。
    因为Applet方案,一般采用html方式呈现数据,打印时Applet必须向服务器检索同一张票据的数据,看上去,是打印了当前页的票据,实际上,Applet根本不会用当前html页的数据来打印,而是向服务器下载数据到Applet中来打印。也就是说,打印的话,必须两次请求,一次html呈现,一次用来打印。
    市场上java类的报表工具,一般推荐Applet方式来实现打印。
七、 轻量级的ActiveX打印方式
这是本公司应客户要求,最新推出的一种最具创意的web套打解决方案。

杰表作为一款纯java的报表工具,以前提供的web套打方案也是基于Applet的,Applet也做到了尽可能的小(只有24kb),但用户还是抱怨,因为jre太大,安装需要耐心。另外,用Applet方式,很难实现客户端的批量打印功能。
我们采用轻量级的ActiveX打印方案,很好地解决了客户的问题。以下是一个典型的该种方案的示例
posted on 2009-02-25 13:44 岁月如歌 阅读(90855) 评论(22)  编辑  收藏 所属分类: js

FeedBack:
# re: web打印,web打印控件的三种实现方法 zz[未登录]
2009-02-25 13:51 | 小白杨
不错,长见识了。  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz
2009-03-13 16:33 | bgrs
国内的 jatoolsPrinter 做得挺不错。我们项目中在用。 print.jatools.com
  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz
2009-04-15 20:12 | interdrp
ReYoPrint (锐洋.打印控件)是一款实现网页套打的专用工具。作为web应用开发者,我们经常会遇到在浏览器中打印报表、票据的需求,这些需求浏览器本身的打印功能一般不能满足, 如精确打印,分页,套打等。这就需要有一种能解决常见的浏览器端打印问题的软件工具,这也是 ReYoPrint 的研发背景。ReYoPrint内含一个在vc7.0上开发的ActiveX控件(73k), 这个控件主要实现对打印参数的控制,ReYoPrint使用户通过JavaScript脚本可以控制分页,页眉页脚,页边距,打印方向,自定义纸张,直接打印,弹出打印对话框再打印,预览,放缩打印,成批打印,套打等功能

ReYoPrint 的主要功能有:

支持设置打印参数,纸张类型,打印方向(横、竖)等 。
支持自定义的页脚、页眉设置。
支持打印区域拖拽及鼠标滚轮放大缩小功能。
支持程序分页与自动分页(支持ESC关闭预览窗口)。
支持打印预览,支持预览时指定页、指定份数打印。
支持直接打印指定票据的URL。
支持票据套打时,底图仅在打印预览时显示,不输出到打印机。
小巧,整个控件只有73K,不需要额外的软件包支持。
与您项目采用的技术标准无关,J2EE、.NET 项目均可。
IE 5.5+ 中适用。
ReYoPrint 的缺点有:

由于控件是基于WebBroser的所以,目前只支持基于IE的WEB打印。
不支持直接打印时选择打印机进行打印。  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz
2009-04-19 21:00 | llp
web打印的需求总在变,远不止这些:
一开始人们只希望把网页内容完整打出来;之后希望打印的内容不要包含页眉页脚;再之后希望不要总是弹出打印对话框,能打印多页,能分页;后来希望打印的位置准确点;再后来希望位置能操作调整,调整后的内容能保存,此后有的希望能打印不显示的内容;再此后就是显示是显示,打印是打印;能打印多个页面的内容,能只按地址打印,能适应各类浏览器...,实际上,这个需求变化的过程就有“网页浏览查看”向“管理系统界面”发展的过程。为什么打印控件lodop一问世就如此流行?方向很重要!控件要能满足未知的需求,开发者才不至于走冤枉路。  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz
2009-06-23 10:04 | 找个美女做老婆
好文章,收藏了

Java乐园技术交流,http://www.javaly.cn
2群群号:28840096  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz
2009-10-13 10:01 | webprint
北京方成公司的打印插件,很不错!

使用特别方便,就是一个很小的activex控件,页面后,就能使用了

设置页边距,页眉页脚,横向,纵向

设置自定义纸张,特定报表绑定特别纸张,指定打印机打印报表

打印url,一次打印多份文档,打印完成后回调事件等等。

有兴趣可以看看 www.fcsoft.com.cn  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz
2009-11-12 17:10 | 预览2010
如果能自己写一个打印控件就好了  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz
2010-01-09 12:35 | exezdl
PAZU -- 4Fang WEB 打印控件 很不错!  回复  更多评论
  
# eee
2010-01-09 12:40 | e
sdreee  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz
2010-01-14 10:13 | start
Eloon WebPrint是为满足不同用户对WEB单据有不同的打印需求而产生,充分考虑到了用户的使用习惯,简单的操作就能定制出理想的打印格式,并且可以把打印格式保存为XML格式描述文档,在下次再进入该页面时,自动加载此格式描述文档进行打印做业。
Eloon WebPrint把打印格式的控制权交给了用户,完全解脱软件开发人员对WEB打印的开发与维护的工作,因此大大加快项目开发进度,为公司节省开发及维护成本。
可以自定义的内容如下:
1. 自定义默认打印机,打印纸型,打印方向,边距。
2. 自定义打印页眉信息。
3. 自定义打印标题。
4. 自定义打印表首信息。
5. 自定义打印表格输出的列及列宽、数据对齐、格式化数据、合计项目控制等。
6. 自定义打印表尾信息。
7. 自定义打印页脚信息。

有中文版.有兴趣可以看看 www.easywebprint.com

  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz
2010-06-18 14:10 | eee
@interdrp
reyo 双打的SCRIPT 在哪呢  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz
2011-05-31 13:26 | 站长工具
不错啊 试试看.  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz
2011-10-27 22:54 | ssxsfj
不错  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz
2012-03-20 15:02 | 郭磊
谢谢,收藏了
  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz
2012-05-24 21:23 | qqq
打印报表时,需要重新向服务器检索数据,效率低。
因为Applet方案,一般采用html方式呈现数据,打印时Applet必须向服务器检索同一张票据的数据,看上去,是打印了当前页的票据,实际上,Applet根本不会用当前html页的数据来打印,而是向服务器下载数据到Applet中来打印。也就是说,打印的话,必须两次请求,一次html呈现,一次用来打印。


可以通过调用applet的方法将打印内容传进去啊


唯一的遗憾是要弹个是否允许使用打印机的提示,  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz[未登录]
2013-04-12 11:32 | rex
国内最专业的打印控件:jatoolsPrinter
且支持chrome,opera,firefox 等非IE浏览器。  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz
2013-04-22 22:49 | lol
好像lodop快一统江湖了。  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz[未登录]
2013-06-27 14:58 | rex
jatoolsPrinter (杰表打印控件) 是国内最专业的网页打印的工具。解决了web客户端精确打印,批量打印,打印配置自动保留等问题。

1、小巧,整个控件只有200k。
2、可以打印预览。
3、支持一维码,二维码显示、打印功能。
4、有可视化设计套打功能,可轻松地拖拽位置、调整样式,保存调整结果;
5、支持票据上万份的连续批量打印,不走样、不偏移。
6、完美支持复杂表格分页。
7、支持excel导出功能。
8、支持浏览器有IE、Firefox、Chrome、Opera、Safari,带微软数字签名。
9、大型电子政务项目、各大软件开发商指定打印控件。   回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz
2013-06-30 11:45 | 9d
jatoolsPrinter有基于web的设计器,允许用户在打印时,拖放打印位置:

http://bbs.jatools.com/attachments/month_1306/20130627_9972c31b7b6719a969deGbHOpI2dwUTu.gif  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz
2013-07-02 12:05 | gdTo
不错的文档,感谢分享,我们公司之前做了一个japerreport报表项目就需要打印功能。找来市面上几乎所有的web打印控件,发现在几百台机子的情况下,稳定性最好的还是jatoolsPrinter.  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz
2013-07-12 15:01 | gdTo
貌似不错的样子!  回复  更多评论
  
# re: web打印,web打印控件的三种实现方法 zz[未登录]
2014-07-23 09:58 | jacob
好厉害,学习了  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: