WEB 打印 print()

1、IE直接打印那个不用多说,直接调用window.print或者webrower控件的ExecWB窍门来打印。方便快捷,客户端无需任何设置即可。利用一部份办法也能够呈现简单的定制,比如做唯一模板htm文档,然后在js中动态创建唯一隐藏帧来,用脚本来生成其中的数据,再把最后的结果文档写入到隐藏帧打印处理。假如处理的好,实际上效果也是不错。对于简单的打印需求因该是够了。那里我举个实际中的例子来说明这种方法:开发中经常需求打印一部份来访量情况的结果给用户,比如说唯一日常学识的功能是营业报表类的打印:操作员先输入查询要求,然后提交得到查询的结果,点击打印后,按照定义好的各式打印报表。咱们呈现上大部份情况会把查询的结果绑定到DataGrid上来,然后打印DataGrid。这种情况的打印一般来说各式较量固定简单,确定后基本不会再作更改。所以能够采用IE直接打印,但若直接调用window.print来打印结果页面,页面上别的无关元素也会被打印出来,页头页尾的各式也不好控制,所以采用把需求打印的数据动态写入到隐藏帧中打印的方法来呈现 代码Code示例:asp.NET中打印指定的DataGrid内容 其中借用来源微软集团公司的一段js代码Code,整个js代码Code如下: //以下脚本呈现:打印指定的datagrid var vGridContent; //DataGrid的内容 var vHeaderInfo; //打印的表头 var vTailerInfo; //打印的表尾 /* 目的:在页面写入隐藏帧并打印参数parameter: vDataGrid 所要打印的DataGrid句柄备注:代码Code中调用如下 btPrint.Attributes.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(); CreateHtmlReport(printHiddenFrame.printMe,vDataGrid); return false; } /* 目的:在隐藏帧中写入DataGrid的内容,并重写DataGrid的各式参数parameter: vHideFrame 隐藏帧的句柄 vDataGrid 所要打印的DataGrid句柄备注: */ function CreateHtmlReport(vHideFrame,vDataGrid) { vGridContent = vDataGrid.outerHTML; // 输出报表头消息及抽取过来的表格 var doc = vHideFrame.document; doc.open(); doc.write( ""); 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 = "2px solid #000000"; vDataGrid.style.borderTop = "2px solid #000000"; vDataGrid.style.borderLeft = "2px solid #000000"; vDataGrid.style.borderBottom = "2px 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 - 3) / 1 + 1) + " 页 / 共 " + "1" + " 页 "; } //创建表头 表尾 function PickupHeaderInfo() { try { // 提取报表题目字体大小 var ReportTitleWithSizeInfo = "" + "无费用用户来访量情况" + "" var reportDate = ""; var reportWriter = ""; var nowdate=new Date(); reportDate = "来访量情况时候:" +nowdate.toLocaleString() + " "; reportDate += "营业厅:测试而已 "; // 生成报表头消息 vHeaderInfo = ""; vHeaderInfo += "" + ""; vHeaderInfo += " " + ReportTitleWithSizeInfo + " "; vHeaderInfo += " " + reportDate; vHeaderInfo += reportWriter + " "; } catch (e) { alert( "提取报表社交消息失败,打印操作被取消!"); self.close(); } } //下面的脚本来源msdn // The code by Captain // Mead & Company, http://www.meadroid.com/wpm/ // fake print() for IE4.x if ( !printIsNativeSupport() ) window.print = printFrame; // main stuff function 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 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.activeElement; 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.insertAdjacentHTML("beforeEnd", "classid=/ "clsid:8856F961-340A-11D0-A96B-00C04FD705A2/">"); printFireEvent(frame, eventScope, "onbeforeprint"); frame.focus(); window.printHelper = printHelper; setTimeout( "window.printHelper()", 0); } // helpers function printIsNativeSupport() { var agent = window.navigator.userAgent; var i = agent.indexOf( "MSIE ")+5; return parseInt(agent.substr(i)) >= 5 && agent.indexOf("5.0b1") < 0; } function printFireEvent(frame, obj, name) { var handler = obj[name]; switch ( typeof(handler) ) { case "string": frame.execScript(handler); break; case "function": handler(); } } function printGetEventScope(frame) { var frameset = frame.document.all.tags("FRAMESET"); if ( frameset.length ) return frameset[0]; 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 PrintDataGrid(document.all('SheetList'))"); 注:SheetList为需求打印的DataGrid ID,在查询后,btPrint为页面上打印按钮的ID 能够将上述脚本代码Code写在唯一js文档中,然后再aspx文档中引用,如 ,上述代码Code的思想较量简单,我不在多说。上述代码Code能够呈现直接打印页面上指定控件的内容,当然最多还那样打印table的内容,假如需求先预览后打印。需求作唯一空的html文档,然后动态写入需求打印的内容: var preDlg = window.open( "PrintList.htm"); CreateHtmlReport(preDlg, true); 2、ActiveX控件自个开发控件。这种方法很多商用热门软件采用这种方法,写成控件后已经无所谓是在web中应用还那样实际运用程式中应用了。打印方法非比寻常灵活,基本上程式能做到的web也能做得到。但客户端需求安装组件,部署否则很方便。 3、.NET组件 卢彦写过一篇很好的文字作品《利用XML呈现通用WEB报表打印》,相信大部份人都看过了。思维新颖,呈现简单,确实不失为一种通用WEB打印解决办法,尤其利用XML来描述打印文档的窍门给以后的各式的拓展留下很好的接口,非比寻常简易扩充。这种打印方法对于各式变化大,数据量小的实际运用来说非比寻常合适。这种思维也给了asp.NET上打印的一种新的思维:自定义一部份组件来呈现灵活的打印功能。当然缺点也是显而易见:1、需求客户端安装NET framework1.0组件。2、XML的解析上,假如文档较大速读上否则很理想。3、页面首次加载时会有明显的延时。当然最大的疑难问题在于客户端需求安装组件,由于大部份采用BS架构的操作系统,客户端配置都不会太高,9x的操作系统居多,假如采用这种方法必将给工程的实施造成很多麻烦,所以最好能有一种方法:既能利用xml这种好的方法来描述打印文档,而且客户端也无需安装任何组件。 在研究了卢大侠的代码Code后,俺有了唯一想法:事实上代码Code里别的功能咱们并不关心,最重要的关键在于xml的解析部份和打印的部份。先来看看XmlDocument的命名空间System.Xml,并非winform特有,webform也能够应用,再看看PrintDocument的命名空间System.Drawing.Printing,查询了MSDN后发明那个命名空间下的类库webform中依然能够应用。好了,咱们最关心的两点WebForm中都能够应用,咱们能够把那个打印控件写成唯一类库,然后在asp.NET中直接调用而客户端无需再安装任何组件了。但随后疑难问题出来了:卢彦的.NET组件是在页面请求的首次下载到本地到客户端执行的,所以组件中能够直接应用各种本地资源,如打印机,互联网等,但咱们的打印控件写成类库由asp.NET程式调用时,实际上组件是在效劳端上运行,它来访效劳端的资源不会有疑难问题,但咱们更期望:运行在效劳端的组件能够来访客户端的资源,如来访客户端的打印机打印指定内容,当然打印的内容估计是在效劳端生成的。这又引出唯一新的疑难问题:asp.NET问号不受控制的来访各种资源。由于安全safe理由,asp.NET程式默认以aspNET 本地用户帐户运行。由于该帐户不具有任何互联网凭据,因此在互联网看来,它是 Windows 匿名帐户 (NT AUTHORITY/ANONYMOUS LOGON),不具有来访本地资源的权限,所以必需采用模仿用户的方法让APS.NET程式以别的帐户形式运行。 思维整理完成清楚,简单说一部份呈现的步骤: A、编写打印组件参考卢彦的代码Code,去除无关部份,只保留xml解析部份和打印部份,PrintControl类中渐增三个成员数据: public string FileName= ""; //需求打印的文档名字 public string PrinterName= ""; //打印机名字 public string ClientIP= ""; //客户端IP地址渐增唯一成员参数: public void PrintPage() { try { doc.Load(FileName); // set the printer name this.printDocument1.PrinterSettings.PrinterName = ClientIP+PrinterName; // add print page event handler this.printDocument1.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,并在需求打印功能的页面放上唯一打印按钮,代码Code中引用RemotePrint命名空间,编写Click事件如下: PrintControl print=new PrintControl(); print.PrintPath =Request.PhysicalApplicationPath; print.ClientIP=Request.ServerVariables["REMOTE_ADDR"] print.PrinterName="printer"; print.PrintPage(); asp.NET项目中Web.Config开启用户模仿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值