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开启用户模仿

控件功能强大,却简单易用,所有调用如同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、付费专栏及课程。

余额充值