四.动态页面生成
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  #endregion
17
18  private void Page_Load(object sender, System.EventArgs e)
19  {   
20    if(!Page.IsPostBack)
21    {
22      InitImage();
23    }
24  }
25
26  private void InitImage()
27  {
28    Bitmap bmp = new Bitmap(800,1120);
29    Graphics g =  Graphics.FromImage(bmp);
30
31    g.FillRectangle(Brushes.Gray,0,0,800,1120);
32
33    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);
41
42    string filename = Server.MapPath("TempImages\\img1.jpg");   
43
44    bmp.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg);
45
46    this.Label1.Text = filename;
47    this.Image1.ImageUrl = filename;
48    this.Image1.Attributes["style"]="POSITION: absolute; LEFT: 0cm;  TOP: 29.7cm"; //定位
49  } 
50 }
51
52

注意:要保证存放图片的目录,有写权限。

3.以上技术只适合于页面元素为固定数量的情况,对于页面内容大小不定的情况,例如,要打印一份人员信息的清单,人员数量为1~1000不等,每页显示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("<h1>Hello,world!</h1>"); 
    writer.Write("</body>");
    writer.Write("</html>");
  }
  }
  编译并运行以上程序,可以看到一行一号字体的"Hello,world!",查看页面源文件,内容如下:
  <HTML><body><h1>Hello,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%Lines==0?0:1);

for(int CurrentPage =0; CurrentPage<TotalPage; 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  style=page-break-before:always></p>");
                          }
   
    writer.Write("<table  width=630 height=417 border=0>");
    writer.Write(" <tr>");
    writer.Write("  <td width=624 height=47><div align=center  style=font-size:24px>人员信息汇总

表</div></td>");
    writer.Write("  </tr>");
    writer.Write("  <tr>");
    writer.Write("  <td height=222>");

writer.Write("    <table width=623  border=1 cellpadding=0 cellspacing=0>");
    writer.Write("    <tr>");
    writer.Write("      <td width=134><div align=center>姓名</div></td>");
    writer.Write("      <td width=134><div align=center>编号</div></td>");
    writer.Write("      <td width=134><div align=center>电话</div></td>");
    writer.Write("      <td width=134><div align=center>小灵通</div></td>");               
    writer.Write("    </tr>");

for(int i=StartRow; i<EndRow; i++)
  {
    DataRow row = tabRY.Rows[i];
    string XM = row["MC"].ToString();
    string BH = row["BH"].ToString();
    string DH = row["LXDH"].ToString();if(DH.Length==0)DH="-";
    string XLT =  row["XLT"].ToString();

writer.Write("    <tr>");
    writer.Write("      <td width=134><div align=center>" + XM + "</div></td>");
    writer.Write("      <td width=134><div align=center>" + BH + "</div></td>");
    writer.Write("      <td width=134><div align=center>" + DH + "</div></td>");
    writer.Write("      <td width=134><div align=center>" + XLT + "</div></td>");

writer.Write("    </tr>");
  }

writer.Write("    </table>");

writer.Write("  </td>");
    writer.Write("  </tr>");
    writer.Write("  <tr>");
    writer.Write("  <td height=37><div align=right>第" + (CurrentPage+1).ToString() +"页,共" +

TotalPage.ToString() + "页</div></td>");
    writer.Write("  </tr>");
    writer.Write("</table>");
  }

感觉又回到了用记事本做网页的年代,手工生成HTML代码,是不是真正叫“随心所欲”。
几点说明:
(1)在每一页(除了第一页)的头部加入 writer.Write("<p  style=page-break-before:always></p>"); 目的是控制在打印时,打印机在此换页。这里通过强制打印机换页来实现页面的布局,与上面的绝对定位的办法不同。该标记只影响打印,不影响显示。
(2)用记事本做网页绝对很痛苦,而且HTML标记也很不好用,我的办法是:用Dreamweaver生成需要的页面,再参照其HTML代码进行编程。
(3)尽量使用HtmlTextWriter类提供的一些其它方法如WriteBeginTag等取代Write方法,这样可以提高页面在客户端的兼容性。同时在每个标记后加入writer.WriteLine();进行换行,以便于调试。

随心所欲的Web页面打印技术 20(转载)相关推荐

  1. 随心所欲的Web页面打印技术

    一.概述   对基于B/S架构的应用程序而言,客户端的页面打印一直是比较头疼的问题,简单的做法是:1.使用IE的打印功能:2.使用水晶报表.但以上两种办法,都有很大的局限性,很难实现特殊要求的排版和精 ...

  2. 转自博客园:随心所欲的Web页面打印技术

    原文地址:http://www.cnblogs.com/seabluescn/archive/2006/11/23/569945.html 一.概述   对基于B/S架构的应用程序而言,客户端的页面打 ...

  3. Web系统页面打印技术实现与分析

    1 Web页面打印概述 应用WEB化,不论对开发商,还是对用户来说,实在是一种很经济的选择,因为基于WEB的应用,客户端的规则很简单,容易学习,容易维护,容易发布.在WEB系统中,打印的确是个烦人的问 ...

  4. C# Web页面打印网页

    C# Web页面打印网页 <style media=print type="text/css">       .noprint{display:none}   < ...

  5. 小tip: base64:URL背景图片与web页面性能优化(转载)

    今天在代码看到css北京图片使用了base64格式表示图片,SO,百度了一下.感觉完全可以解释了. 一.base64百科 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在H ...

  6. Web页面打印及GridView导出到Excel

    打印Web页面 在头部<head>加入 打印事件 <script   language=javascript>      function   doPrint()   {    ...

  7. VIPS:基于视觉的Web页面分页算法(转载)

    VIPS:基于视觉的Web页面分页算法 1.问题的提出 目 前,随着互联网的高速发展,Web已经成为这个世界上最大的信息来源.Web 作为信息技术的载体已成为人们重要的工作.学习.生活.娱乐工具.We ...

  8. 关于ASP.NET页面打印技术的总结

    网络打印概述 • B/S结构导致了Web应用程序中打印的特殊性. • 程序运行在浏览器中,打印机在本地,而文件确可能在服务器上,导致了打印控制不是很灵活. • 格式如何控制和定制等,是我们开发中可能会 ...

  9. 介绍一种Web上打印技术

    一.    介绍ScriptX控件 对于B/S架构的项目中,Web打印最是让程序员头痛的技术,在这次项目中运用了第三方控件ScriptX解决了此技术包括各种汇总表,详细清单等等,但最大弊端就是打印的格 ...

最新文章

  1. BC547 晶体管初步测试
  2. 大数据驱动下的微博社会化推荐
  3. NASM汇编helloworld图解
  4. Jenkins中安装Role-based Authorization Strategy插件来实现用户角色权限管理
  5. BZOJ1115:[POI2009]石子游戏Kam(博弈论)
  6. C语言unit test单元测试类的实现(附完整源码)
  7. CentOS7 添加端口
  8. Python深入理解yield
  9. MySQL 数据查询
  10. 字符串json中函数的定义与解析
  11. vue开发app端使用H5+下载文件流
  12. 2013年字库产业感悟及资料书单
  13. vhosts.conf域名配置
  14. Android基础四大组件详解
  15. cuda cudnn tensorflow对应_Cuda 的安装步骤
  16. 【Leetcode刷题Python】40. 组合总和 II
  17. PCIE switch 连接绿联SSD
  18. OpenStack新版UI管理skyline
  19. ARMCortex系列仿真调试器
  20. 不凡的夫夫 斯特林公式的应用

热门文章

  1. 数据库中select将查询结果多加一个字段并填写内容
  2. Oracle 删除命令详解
  3. ECSHOP订单管理系统,ecshop客户资料同步管理软件
  4. 最全软件开发面试问题总结(根据cyc大佬目录整理)【中】
  5. 写给新手前端的各种文件上传攻略,从小图片到大文件断点续传
  6. win2012创建域用户,组
  7. 下载dokcer镜像卡住了怎么办?
  8. 计算机专业研究生如何看论文
  9. 点击confirm的取消如何隐藏提示框
  10. MySQL修改字段命令