随心所欲的Web页面打印技术 20(转载)
四.动态页面生成
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(转载)相关推荐
- 随心所欲的Web页面打印技术
一.概述 对基于B/S架构的应用程序而言,客户端的页面打印一直是比较头疼的问题,简单的做法是:1.使用IE的打印功能:2.使用水晶报表.但以上两种办法,都有很大的局限性,很难实现特殊要求的排版和精 ...
- 转自博客园:随心所欲的Web页面打印技术
原文地址:http://www.cnblogs.com/seabluescn/archive/2006/11/23/569945.html 一.概述 对基于B/S架构的应用程序而言,客户端的页面打 ...
- Web系统页面打印技术实现与分析
1 Web页面打印概述 应用WEB化,不论对开发商,还是对用户来说,实在是一种很经济的选择,因为基于WEB的应用,客户端的规则很简单,容易学习,容易维护,容易发布.在WEB系统中,打印的确是个烦人的问 ...
- C# Web页面打印网页
C# Web页面打印网页 <style media=print type="text/css"> .noprint{display:none} < ...
- 小tip: base64:URL背景图片与web页面性能优化(转载)
今天在代码看到css北京图片使用了base64格式表示图片,SO,百度了一下.感觉完全可以解释了. 一.base64百科 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在H ...
- Web页面打印及GridView导出到Excel
打印Web页面 在头部<head>加入 打印事件 <script language=javascript> function doPrint() { ...
- VIPS:基于视觉的Web页面分页算法(转载)
VIPS:基于视觉的Web页面分页算法 1.问题的提出 目 前,随着互联网的高速发展,Web已经成为这个世界上最大的信息来源.Web 作为信息技术的载体已成为人们重要的工作.学习.生活.娱乐工具.We ...
- 关于ASP.NET页面打印技术的总结
网络打印概述 • B/S结构导致了Web应用程序中打印的特殊性. • 程序运行在浏览器中,打印机在本地,而文件确可能在服务器上,导致了打印控制不是很灵活. • 格式如何控制和定制等,是我们开发中可能会 ...
- 介绍一种Web上打印技术
一. 介绍ScriptX控件 对于B/S架构的项目中,Web打印最是让程序员头痛的技术,在这次项目中运用了第三方控件ScriptX解决了此技术包括各种汇总表,详细清单等等,但最大弊端就是打印的格 ...
最新文章
- BC547 晶体管初步测试
- 大数据驱动下的微博社会化推荐
- NASM汇编helloworld图解
- Jenkins中安装Role-based Authorization Strategy插件来实现用户角色权限管理
- BZOJ1115:[POI2009]石子游戏Kam(博弈论)
- C语言unit test单元测试类的实现(附完整源码)
- CentOS7 添加端口
- Python深入理解yield
- MySQL 数据查询
- 字符串json中函数的定义与解析
- vue开发app端使用H5+下载文件流
- 2013年字库产业感悟及资料书单
- vhosts.conf域名配置
- Android基础四大组件详解
- cuda cudnn tensorflow对应_Cuda 的安装步骤
- 【Leetcode刷题Python】40. 组合总和 II
- PCIE switch 连接绿联SSD
- OpenStack新版UI管理skyline
- ARMCortex系列仿真调试器
- 不凡的夫夫 斯特林公式的应用