佛山正规网站建设报价,我要下载百度,贵州公司网站建设比选公示,wordpress菜单不现实一.概述 对基于B/S架构的应用程序而言#xff0c;客户端的页面打印一直是比较头疼的问题#xff0c;简单的做法是#xff1a;1.使用IE的打印功能#xff1b;2.使用水晶报表。但以上两种办法#xff0c;都有很大的局限性#xff0c;很难实现特殊要求的排版和精确的定位客户端的页面打印一直是比较头疼的问题简单的做法是1.使用IE的打印功能2.使用水晶报表。但以上两种办法都有很大的局限性很难实现特殊要求的排版和精确的定位所以不能满足一些特殊客户的BT要求。为此本人总结了自己在使用Web打印上的一点经验和大家分享。 本文涉及以下技术javascript、ActiveX、ASP.NET、GDI。 二.基本架构 首先我们不能使用IE的打印功能必须自己设计‘打印’按钮。很多人习惯将‘打印’按钮放在要打印的页面上打印时为了不把这个按钮打印出来采用办法如下1.打印前隐藏按钮2.打印3.显示按钮。 我觉得这样比较麻烦所以我采用框架。一共有三个页面 1.main.htm :框架页面上面是打印按钮下面是要显示的页面。 2.header.htm :标题栏至少包含一个打印按钮。 3.report.aspx :要打印的页面由用户生成。 //main.htm html head title/title /head frameset rows10%,90% frameborder0 border0 frameSpacing0 frame idheader nameheader srcHeader.htm noresize scrollingno frame idreport namereport srcReport.aspx noresize scrollingauto /frameset /html //header.htm html head script idclientEventHandlersJS languagejavascript !-- function btnPrint_onclick() { parent.report.focus(); parent.report.print(); } //-- /script /head body INPUT idbtnPrint typebutton valuePrint namePrint οnclickreturn btnPrint_onclick() /body /html 这样在点击‘打印’按钮时将直接打印report.aspx页面的内容既简单又直观。 三.打印 要完全控制打印就必须由程序设定页眉、页脚、页边距。每个客户端的IE设置都不尽相同你可以要求你的客户修改他们的打印设置为你指定的值显然这不现实。所以正确的做法是 1.备份客户打印页面设置; 2.设置页眉页脚上下左右边距为自己需要的值; 3.打印; 4.恢复原来的打印页面设置。 这里用到一个叫ScriptX的控件。你需要下载一个文件smsx.cab下载地址http://www.meadroid.com/scriptx/sxdownload.asp。这个地址并不能保证长期有效你可以在搜索引擎上搜索‘ScriptX’以获得更多相关信息。 在“header.htm”中增加该控件的引用 OBJECT idfactory styleDISPLAY: none codeBasehttp://localhost/WebApplication1/smsx.cab#VVersion6,3,434,12 classidclsid:1663ed61-23eb-11d2-b92f-008048fdd814 viewastext /OBJECT 注意CodeBase指向你的实际存放文件的位置在客户端第一次浏览该页面时将下载并安装该控件请确定客户端的安全设置允许安装控件。 那么此时 header.htm 的内容如下。 //header.htm html head script idclientEventHandlersJS languagejavascript !-- function btnPrint_onclick() { //备份客户打印机设置 var h factory.printing.header; var f factory.printing.footer; var t factory.printing.topMargin; var b factory.printing.bottomMargin; var l factory.printing.leftMargin; var r factory.printing.rightMargin; //设置页眉页脚上下左右边距 factory.printing.header ; factory.printing.footer ; factory.printing.topMargin0; factory.printing.bottomMargin0; factory.printing.leftMargin0; factory.printing.rightMargin0; //打印 parent.report.focus(); parent.report.print() //恢复原来的打印设置 factory.printing.header h; factory.printing.footer f; factory.printing.topMargint; factory.printing.bottomMarginb; factory.printing.leftMarginl; factory.printing.rightMarginr; } //-- /script OBJECT idfactory styleDISPLAY: none codeBasehttp://localhost/WebApplication1/smsx.cab#VVersion6,3,434,12 classidclsid:1663ed61-23eb-11d2-b92f-008048fdd814 viewastext /OBJECT /head body bgColor#9999cc INPUT idbtnPrint typebutton valuePrint namePrint οnclickreturn btnPrint_onclick() /body /html 此时不管客户端IE设置如何都能正确打印页面打印内容将完全取决于页面report.aspx。 四.动态页面生成 1. 如果你的页面是静态页面或者页面元素为固定数量那就非常简单了。只要调整好各个元素位置就行了绝对所见即所得。要注意的是一个A4纸的大小为21cm×29.7cm对应象素大约为 794×1123 (系统分辨率96DPI) 。 2.如果你要生成一些图表可以使用GDI你自己绘制的图片绝对能满足客户需求。下面给一个例子我在页面放一个Label一个Image。Image动态生成调整其位置使其打印时出现在第二页的左上角。 1public class Report : System.Web.UI.Page 2 { 3 protected System.Web.UI.WebControls.Image Image1; 4 protected System.Web.UI.WebControls.Label Label1; 5 6 Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码 7 override protected void OnInit(EventArgs e) 8 { 9 InitializeComponent();10 base.OnInit(e);11 }12 private void InitializeComponent()13 { 14 this.Load new System.EventHandler(this.Page_Load);15 }16 #endregion1718 private void Page_Load(object sender, System.EventArgs e)19 { 20 if(!Page.IsPostBack)21 {22 InitImage();23 }24 }2526 private void InitImage()27 {28 Bitmap bmp new Bitmap(800,1120);29 Graphics g Graphics.FromImage(bmp);3031 g.FillRectangle(Brushes.Gray,0,0,800,1120);3233 g.FillRectangle(Brushes.RoyalBlue,0,0,100,600);34 g.FillRectangle(Brushes.Aqua,600,0,100,600);35 g.FillRectangle(Brushes.Coral,700,0,100,600); 36 37 g.FillRectangle(Brushes.YellowGreen,0,800,800,100);38 g.FillRectangle(Brushes.Beige,0,900,800,100);39 g.FillRectangle(Brushes.SkyBlue,0,1000,800,100);40 g.FillRectangle(Brushes.Tomato,0,1100,800,20);4142 string filename Server.MapPath(TempImages\\img1.jpg); 4344 bmp.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg);4546 this.Label1.Text filename;47 this.Image1.ImageUrl filename;48 this.Image1.Attributes[style]POSITION: absolute; LEFT: 0cm; TOP: 29.7cm; //定位49 } 50 }5152 注意要保证存放图片的目录有写权限。 3.以上技术只适合于页面元素为固定数量的情况对于页面内容大小不定的情况例如要打印一份人员信息的清单人员数量为11000不等每页显示20条记录要有规定的页眉、页脚此时该如何处理。 思路ASP.NET页面都有一个基类System.Web.UI.Page该类有一个保护方法叫void Render(HtmlTextWriter writer)就是通过这个方法ASP.NET在后台把WEB服务器端控件的属性转换成HTML代码并发送到客户端供浏览器显示。我们的办法就是“劫持”该方法完全手工生成所需页面标记代码。 先看一个例子 public class FrmRYInfo : System.Web.UI.Page { private void Page_Load(object sender, System.EventArgs e) { } protected override void Render(HtmlTextWriter writer) { writer.Write(HTML); writer.Write(body); writer.Write(h1Hello,world!/h1); writer.Write(/body); writer.Write(/html); } } 编译并运行以上程序可以看到一行一号字体的Hello,world!,查看页面源文件内容如下 HTMLbodyh1Hello,world!/h1/body/html 对照上面代码应该非常好理解下面我们就做一个实际的例子将信息从数据库读出显示在页面上每页显示15条记录。 protected override void Render(HtmlTextWriter writer) { writer.Write(HTML); writer.Write(body); DataTable tabRY GetCustomerInfo(); //读取数据库 int Lines 15; //每页行数 int Count tabRY.Rows.Count; int TotalPage Count/Lines (Count%Lines0?0:1); for(int CurrentPage 0; CurrentPageTotalPage; CurrentPage) { int StartRow CurrentPage * Lines; int EndRow StartRow Lines; if(EndRow Count) EndRow Count; ProcessCurrentPage(writer,tabRY,StartRow,EndRow,CurrentPage,TotalPage); } writer.Write(/body); writer.Write(/html); } private void ProcessCurrentPage(HtmlTextWriter writer, DataTable tabRY, int StartRow, int EndRow, int CurrentPage, int TotalPage) { if(CurrentPage ! 0) { writer.Write(p stylepage-break-before:always/p); } writer.Write(table width630 height417 border0); writer.Write( tr); writer.Write( td width624 height47div aligncenter stylefont-size:24px人员信息汇总表/div/td); writer.Write( /tr); writer.Write( tr); writer.Write( td height222); writer.Write( table width623 border1 cellpadding0 cellspacing0); writer.Write( tr); writer.Write( td width134div aligncenter姓名/div/td); writer.Write( td width134div aligncenter编号/div/td); writer.Write( td width134div aligncenter电话/div/td); writer.Write( td width134div aligncenter小灵通/div/td); writer.Write( /tr); for(int iStartRow; iEndRow; i) { DataRow row tabRY.Rows[i]; string XM row[MC].ToString(); string BH row[BH].ToString(); string DH row[LXDH].ToString();if(DH.Length0)DH-; string XLT row[XLT].ToString(); writer.Write( tr); writer.Write( td width134div aligncenter XM /div/td); writer.Write( td width134div aligncenter BH /div/td); writer.Write( td width134div aligncenter DH /div/td); writer.Write( td width134div aligncenter XLT /div/td); writer.Write( /tr); } writer.Write( /table); writer.Write( /td); writer.Write( /tr); writer.Write( tr); writer.Write( td height37div alignright第 (CurrentPage1).ToString() 页共 TotalPage.ToString() 页/div/td); writer.Write( /tr); writer.Write(/table); } 感觉又回到了用记事本做网页的年代手工生成HTML代码是不是真正叫“随心所欲”。 几点说明 (1)在每一页除了第一页的头部加入 writer.Write(p stylepage-break-before:always/p); 目的是控制在打印时打印机在此换页。这里通过强制打印机换页来实现页面的布局与上面的绝对定位的办法不同。该标记只影响打印不影响显示。 (2)用记事本做网页绝对很痛苦而且HTML标记也很不好用我的办法是用Dreamweaver生成需要的页面再参照其HTML代码进行编程。 (3)尽量使用HtmlTextWriter类提供的一些其它方法如WriteBeginTag等取代Write方法这样可以提高页面在客户端的兼容性。同时在每个标记后加入writer.WriteLine();进行换行以便于调试。 转载于:https://www.cnblogs.com/Aioria0622/archive/2007/12/03/981434.html