web打印 【转】

3 篇文章 0 订阅
2 篇文章 0 订阅

[转]  http://www.blogjava.net/midstr/archive/2009/02/25/256597.html

做管理系统的时候,打印一直是个棘手的问题,做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来设计格式。
  
   一般这种类型的打印控件都是需要收费的,用户可以从经济的角度来考虑。
==========================================================================================================

一、 浏览器的打印功能菜单
这种方案的优势是不需要对浏览器作任何扩充,是最简单的办法,但问题也最多,如:
不能精确分页。
浏览器一般是根据用户设置的页面大小,web页面的内容多少,来自行决定分页位置,程序员很难控制。会有页脚页眉干扰。
不能准确对齐边边距及打印文字。
不能解决连续打印。
比如,不是仅打印一张票据,而是连续一次打印若干个票据。
二、 使用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方式,分页或精确打印,都可以做到完美,但缺点也很明显,表现在:
安装Applet成本巨大。需要下载十几M的文件。
Applet本身可能并不大,但运行Applet所需的jre一般至少10几M(jre1.4.2 , 15.45M)。用户需要极大的耐心,来进行打印。
打印报表时,需要重新向服务器检索数据,效率低。
因为Applet方案,一般采用html方式呈现数据,打印时Applet必须向服务器检索同一张票据的数据,看上去,是打印了当前页的票据,实际上,Applet根本不会用当前html页的数据来打印,而是向服务器下载数据到Applet中来打印。也就是说,打印的话,必须两次请求,一次html呈现,一次用来打印。
市场上java类的报表工具,一般推荐Applet方式来实现打印。
七、 轻量级的ActiveX打印方式
这是本公司应客户要求,最新推出的一种最具创意的web套打解决方案。
杰表作为一款纯java的报表工具,以前提供的web套打方案也是基于Applet的,Applet也做到了尽可能的小(只有24kb),但用户还是抱怨,因为jre太大,安装需要耐心。另外,用Applet方式,很难实现客户端的批量打印功能。
我们采用轻量级的ActiveX打印方案,很好地解决了客户的问题。以下是一个典型的该种方案的示例

  • 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、付费专栏及课程。

余额充值