ImageVerifierCode 换一换
格式:DOCX , 页数:7 ,大小:20.49KB ,
资源ID:3518233      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3518233.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(aspnet之web打印.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

aspnet之web打印.docx

1、aspnet之web打印ASP.NET之Web打印日期:2007-02-18来源:blog 作者:字体:大 中 小 做过bs开发的同志应该都深有体会,在web程序中打印不再象应用程序中那样便于控制了,web程序天生的一些特性造成了这个缺点,如:打印机在本地,而文件确可能在服务器上;格式如何控制和定制等等。都给我们开发中带来了很多问题,虽说有水晶报表等控件来解决但总归是不方便。当然有了问题就会有人来研究解决,这里我先对目前流行的几种方式做个简单介绍: 1、IE直接打印这个不用多说,直接调用window.print或者webrower控件的ExecWB方法来打印。方便快捷,客户端无需任何设置即可。

2、利用一些办法也可以实现简单的定制,比如做一个模板htm文件,然后在js中动态创建一个隐藏帧来,用脚本来生成其中的数据,再把最后的结果文件写入到隐藏帧打印处理。如果处理的好,实际上效果也是不错。对于简单的打印需求应该是够了。这里我举个实际中的例子来说明这种方式:开发中经常需要打印一些统计的结果给用户,比如说一个常见的功能是营业报表类的打印:操作员先输入查询条件,然后提交得到查询的结果,点击打印后,按照定义好的格式打印报表。我们实现上大部分情况会把查询的结果绑定到DataGrid上来,然后打印DataGrid。这种情况的打印一般来说格式比较固定简单,确定后基本不会再作更改。所以可以采用IE直接打印

3、,但若直接调用window.print来打印结果页面,页面上别的无关元素也会被打印出来,页头页尾的格式也不好控制,所以采用把需要打印的数据动态写入到隐藏帧中打印的方式来实现代码示例:ASP.NET中打印指定的DataGrid内容其中借用来自微软的一段js代码,整个js代码如下:/以下脚本实现:打印指定的datagridvar vGridContent;/DataGrid的内容var vHeaderInfo;/打印的表头var vTailerInfo;/打印的表尾/*目的:在页面写入隐藏帧并打印参数:vDataGrid 所要打印的DataGrid句柄备注:代码中调用如下btPrint.Attri

4、butes.Add(onclick,return PrintDataGrid(document.all(SheetList);SheetList为待打印的DataGrid的ID*/function PrintDataGrid(vDataGrid) PickupHeaderInfo(); document.body.insertAdjacentHTML(beforeEnd, ); var doc = printHiddenFrame.document; doc.open(); doc.write(); doc.write(); doc.write(); doc.close(); CreateHt

5、mlReport(printHiddenFrame.printMe,vDataGrid); return false; /*目的:在隐藏帧中写入DataGrid的内容,并重写DataGrid的格式参数:vHideFrame 隐藏帧的句柄vDataGrid 所要打印的DataGrid句柄备注:*/function CreateHtmlReport(vHideFrame,vDataGrid)vGridContent = vDataGrid.outerHTML;/ 输出报表头信息及抽取过来的表格 var doc = vHideFrame.document;doc.open();doc.write()

6、;doc.write(vHeaderInfo);doc.write(vGridContent);doc.write();doc.close(); / 重新设置表格样式vDataGrid.borderColor = #000000;vDataGrid.width = 100%;vDataGrid.style.fontFamily = Verdana;vDataGrid.style.fontSize = 12px;vDataGrid.style.borderRight = 1px solid #000000;vDataGrid.style.borderTop = 1px solid #000000

7、;vDataGrid.style.borderLeft = 1px solid #000000;vDataGrid.style.borderBottom = 1px solid #000000;vDataGrid.style.borderCollapse = collapse;/ 重新设置表格头样式var TBody = vDataGrid.children(0);TBody.children(0).style.fontWeight = bold;TBody.children(0).bgColor = #E7E7E7;/ 替换原表格底部的页码信息var pageInfo = 第 + (4 -

8、3) / 1 + 1) + 页 / 共 + 1 + 页    /创建表头 表尾function PickupHeaderInfo()try/ 提取报表标题字体大小var ReportTitleWithSizeInfo = + 无费用用户统计 + var reportDate = ;var reportWriter = ;var nowdate=new Date();reportDate = 统计时间: +nowdate.toLocaleString() + ;reportDate +=营业厅:测试而已;/ 生成报表头信息vHeaderInfo = ;vH

9、eaderInfo += 无费用用户统计 +;vHeaderInfo += + ReportTitleWithSizeInfo + ;vHeaderInfo += + reportDate;vHeaderInfo += reportWriter + ;catch (e)alert(提取报表公共信息失败,打印操作被取消!);self.close();/下面的脚本来自msdn/ The code by Captain / Mead & Company, / fake print() for IE4.xif ( !printIsNativeSupport() ) window.print = pri

10、ntFrame;/ main stufffunction printFrame(frame, onfinish) if ( !frame ) frame = window; if ( frame.document.readyState != complete & !confirm(The document to print is not downloaded yet! Continue with printing?) ) if ( onfinish ) onfinish(); return; if ( printIsNativeSupport() ) /* focus handling for

11、 this scope is IE5Beta workaround, should be gone with IE5 RTM. */ var focused = document.activeElement; frame.focus(); frame.self.print(); if ( onfinish ) onfinish(); if ( focused & !focused.disabled ) focused.focus(); return; var eventScope = printGetEventScope(frame); var focused = document.activ

12、eElement; window.printHelper = function() execScript(on error resume next: printWB.ExecWB 6, 1, VBScript); printFireEvent(frame, eventScope, onafterprint); printWB.outerHTML = ; if ( onfinish ) onfinish(); if ( focused & !focused.disabled ) focused.focus(); window.printHelper = null; document.body.i

13、nsertAdjacentHTML(beforeEnd, ); printFireEvent(frame, eventScope, onbeforeprint); frame.focus(); window.printHelper = printHelper; setTimeout(window.printHelper(), 0);/ helpersfunction printIsNativeSupport() var agent = window.navigator.userAgent; var i = agent.indexOf(MSIE )+5; return parseInt(agen

14、t.substr(i) = 5 & agent.indexOf(5.0b1) 0;function printFireEvent(frame, obj, name) var handler = objname; switch ( typeof(handler) ) case string: frame.execScript(handler); break; case function: handler(); function printGetEventScope(frame) var frameset = frame.document.all.tags(FRAMESET); if ( fram

15、eset.length ) return frameset0; return frame.document.body;function onprintHiddenFrame() function onfinish() printHiddenFrame.outerHTML = ; if ( window.onprintcomplete ) window.onprintcomplete(); printFrame(printHiddenFrame.printMe, onfinish);程序中在Page_Load里面加上:btPrint.Attributes.Add(onclick,return P

16、rintDataGrid(document.all(SheetList);注:SheetList为需要打印的DataGrid ID,在查询后,btPrint为页面上打印按钮的ID可以将上述脚本代码写在一个js文件中,然后再aspx文件中引用,如,上述代码的原理比较简单,我不在多说。上述代码可以实现直接打印页面上指定控件的内容,当然最多还是打印table的内容,如果需要先预览后打印。需要作一个空的html文件,然后动态写入需要打印的内容:var preDlg = window.open(PrintList.htm);CreateHtmlReport(preDlg, true);2、ActiveX

17、控件自己开发控件。这种方式很多商用软件采用这种方式,写成控件后已经无所谓是在web中使用还是应用程序中使用了。打印方式非常灵活,基本上程序能做到的web也能做得到。但客户端需要安装组件,部署不是很方便。3、.NET组件卢彦写过一篇很好的文章利用XML实现通用WEB报表打印,相信大家都看过了。思路新颖,实现简单,确实不失为一种通用WEB打印解决办法,尤其利用XML来描述打印文件的方法给以后的格式的拓展留下很好的接口,非常容易扩充。这种打印方式对于格式变化大,数据量小的应用来说非常合适。这种思路也给了ASP.NET上打印的一种新的思路:自定义一些组件来实现灵活的打印功能。当然缺点也是显而易见:1、

18、需要客户端安装NET framework1.0组件。2、XML的解析上,如果文件较大速度上不是很理想。3、页面首次加载时会有明显的延时。当然最大的问题在于客户端需要安装组件,因为大部分采用BS架构的系统,客户端配置都不会太高,9x的操作系统居多,如果采用这种方式必将给工程的实施造成很多麻烦,所以最好能有一种方式:既能利用xml这种好的方式来描述打印文件,而且客户端也无需安装任何组件。在研究了卢大侠的代码后,俺有了一个想法:事实上代码里别的功能我们并不关心,最重要的关键在于xml的解析部分和打印的部分。先来看看XmlDocument的命名空间System.Xml,并非winform特有,webf

19、orm也可以使用,再看看PrintDocument的命名空间System.Drawing.Printing,查询了MSDN后发现这个命名空间下的类库webform中依然可以使用。好了,我们最关心的两点WebForm中都可以使用,我们可以把这个打印控件写成一个类库,然后在ASP.NET中直接调用而客户端无需再安装任何组件了。但随后问题出来了:卢彦的.NET组件是在页面请求的首次下载到客户端执行的,所以组件中可以直接使用各种本地资源,如打印机,网络等,但我们的打印控件写成类库由ASP.NET程序调用时,实际上组件是在服务端上运行,它访问服务端的资源不会有问题,但我们更希望:运行在服务端的组件可以访

20、问客户端的资源,如访问客户端的打印机打印指定内容,当然打印的内容可能是在服务端生成的。这又引出一个新的问题:ASP.NET如何不受限制的访问各种资源。由于安全原因,ASP.NET程序默认以ASPNET 本地用户帐户运行。由于该帐户不具有任何网络凭据,因此在网络看来,它是 Windows 匿名帐户 (NT AUTHORITYANONYMOUS LOGON),不具有访问本地资源的权限,所以必须采用模拟用户的方式让APS.NET程序以别的帐户形式运行。思路已经整理清楚,简单说一些实现的步骤:A、编写打印组件参考卢彦的代码,去除无关部分,只保留xml解析部分和打印部分,PrintControl类中增加

21、三个成员数据:public stringFileName=;/需要打印的文件名称public string PrinterName=;/打印机名称public string ClientIP=;/客户端IP地址增加一个成员函数:public void PrintPage()trydoc.Load(FileName);/ set the printer namethis.printDocument1.PrinterSettings.PrinterName = ClientIPPrinterName;/ add print page event handlerthis.printDocument1

22、.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);/ print the page/string tm=User.Identity.Name;this.printDocument1.Print();error_msg=打印成功;catch(Exception ex)error_msg = ex.Message;注意:客户端的打印机必须是共享别的xml解析部分不用动,编译成类库后,在ASP.NET引用RemotePrint.dll,并在需要打印功能的页面放上一个打印按钮,代码中引用RemotePrint命名空间,编写Click事件如下:PrintControl print=new PrintControl();print.PrintPath=Request.PhysicalApplicationPath;print.ClientIP=Request.ServerVariablesREMOTE_ADDRprint.PrinterName=printer; print.PrintPage();ASP.NET项目中Web.Config开启用户模拟:上述解决办法必须基于一个前提,服务端和客户端是运行在同一个网段内,不过仔细想想,有上述打印需求的BS系统一般都运行在企业的内网上,所以基本上满足要求

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1