利用ASP.NET实现web套打

 

    最近,要把一个C/S结构的程序改成B/S结构。其中就遇到了打印的问题。研究了一下,web下打印方法大概有这么几种:

1、利用IE直接打印,这种方式最方便,但是控制能力较差。

2、利用ACTIVE控件,可以自己做一个IE的控件来控制打印。

3、水晶报表等第三方工具,购买价格昂贵。

    根据我的需求情况,用IE直接打印的方式可以满足。我们的目的就是在一张申请表格上对应位置打印上相应的项目,表格也只有一页,不涉及分页的问题。

   先来看一下表格,目的就是在一个WEBFORM里面对应的TEXTBOX内容放到对应的位置打印出来。

    先来说一下我的思路:程序自动生成一个要打印的网页,将对应的字段值传递给这个网页,每个字段的位置事先量好,利用<div style="   ">来控制对应字段在页面中的位置。具体要到了下面技术:

1、自定义一个打印类,用来自动生成要打印的网页。

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
using System.IO;
using System.Collections;

///


/// MyPrint 的摘要说明
///

public class MyPrint : System.Web.UI.Page
{
    public static string pageUrlBase;//Page基本的URL
    public string name;
    public string sex;
    public string brithday;
    public string country;
    public string CardName;
    public string CardNum;
    public string address;
    public string touchAddress;
    public string tel;
    public string postCode;
    public string type;
    public string reg;
    public string oldReg;
    ///
    /// 恢复打印模板
    ///

    ///
    ///

  public void ClearView()
    {
        StringBuilder htmltext = new StringBuilder();
        try
        {
            if (!File.Exists(Server.MapPath(Context.Request.ApplicationPath) + "//printwindow.htm"))
            {
                FileStream fs = File.Create(Server.MapPath(Context.Request.ApplicationPath) + "//printwindow.htm");
                fs.Close();
            }
            using (StreamWriter sw = new StreamWriter(Server.MapPath(Context.Request.ApplicationPath) + "//printwindow.htm",false,Encoding.Default))
            {
                string sTableTitle = "";
                sTableTitle = sTableTitle + "<html>/n";
                sTableTitle = sTableTitle + "<head>/n";
                sTableTitle = sTableTitle + "<Title></Title>/n";
                sTableTitle = sTableTitle + "<meta http-equiv=/"Content-Type/" content=/"text/html; charset=GB2312/">/n";
                sTableTitle = sTableTitle + "<script lanage=/"javascript/">";
                sTableTitle = sTableTitle + "function preview()";
                sTableTitle = sTableTitle + "{";
                sTableTitle = sTableTitle + "window.print();window.close()}</script>";
                sTableTitle = sTableTitle + "</head>";

                sTableTitle = sTableTitle + "<body style=/"background-position: left top; background-image: url(Images/申请表.jpg); left: 0px; width: 735px; position: absolute; top: 0px; height: 1050px;/" ms_positioning=/"GridLayout/"    topmargin=/"0/" bottommargin=/"0/"  οnlοad=/"preview();/">/n";
                //sTableTitle = sTableTitle + "Model/n";
                //正式页面内容部分
                sTableTitle = sTableTitle + "<font face=/"宋体/">";
                sTableTitle = sTableTitle + "<div  Style=/"z-index: 100; left: 138px; position: absolute; top: 176px/">" + name + "</div>";
                //sTableTitle = sTableTitle + "<img src=/"Images/1234.jpg/" Style=/"z-index: 116; left: 119px; position: absolute; top: 439px/"  Width=/"8px/" Height=/"8px/" />";
                sTableTitle = sTableTitle + "<div  Style=/"z-index: 101; left: 395px; position: absolute; top: 176px/">" + sex + "</div>";
                sTableTitle = sTableTitle + "<div  Style=/"z-index: 102; left: 488px; position: absolute; top: 176px/">" + brithday + "</div>";
                sTableTitle = sTableTitle + "<div  Style=/"z-index: 103; left: 640px; position: absolute; top: 176px/">" + country + "</div>";
                sTableTitle = sTableTitle + "<div  Style=/"z-index: 104; left: 138px; position: absolute; top: 200px/">" + CardName + "</div>";
                //sTableTitle = sTableTitle + "<div  Style=/"z-index: 105; left: 272px; position: absolute; top: 200px/">" + CardNum + "</div>";
                sTableTitle = sTableTitle + "<div  Style=/"z-index: 106; left: 136px; position: absolute; top: 256px/">" + address + "</div>";
                sTableTitle = sTableTitle + "<div  Style=/"z-index: 107; left: 136px; position: absolute; top: 288px/">" + touchAddress + "</div>";
                sTableTitle = sTableTitle + "<div  Style=/"z-index: 108; left: 136px; position: absolute; top: 320px/">" + tel + "</div>";
                sTableTitle = sTableTitle + "<div  Style=/"z-index: 109; left: 472px; position: absolute; top: 320px/">" + postCode + "</div>";
                sTableTitle = sTableTitle + "<div  Style=/"z-index: 110; left: 352px; position: absolute; top: 352px/">" + reg + "</div>";
                //sTableTitle = sTableTitle + "<div  Style=/"z-index: 112; left: 119px; position: absolute; top: 358px/">姓名</div>";
                //判断是否是初次申领还是什么地
                if(type=="初次申领")
                    sTableTitle = sTableTitle + "<img src=/"Images/1234.jpg/" Style=/"z-index: 112; left: 128px; position: absolute; top: 358px/"  Width=/"8px/" Height=/"8px/" />";
                else if (type == "增加准驾车型")
                {
                    sTableTitle = sTableTitle + "<img src=/"Images/1234.jpg/" Style=/"z-index: 115; left: 118px; position: absolute; top: 384px/"  Width=/"8px/" Height=/"8px/" />";
                    sTableTitle = sTableTitle + "<div  Style=/"z-index: 111; left: 600px; position: absolute; top: 352px/">" + oldReg + "</div>";
                }
                else if (type == "持军警驾驶证")
                {
                    sTableTitle = sTableTitle + "<img src=/"Images/1234.jpg/" Style=/"z-index: 114; left: 118px; position: absolute; top: 409px/"  Width=/"8px/" Height=/"8px/" />";
                    sTableTitle = sTableTitle + "<div  Style=/"z-index: 111; left: 600px; position: absolute; top: 352px/">" + oldReg + "</div>";

                }
                else
                {
                    sTableTitle = sTableTitle + "<img src=/"Images/1234.jpg/" Style=/"z-index: 116; left: 119px; position: absolute; top: 439px/"  Width=/"8px/" Height=/"8px/" />";
                    sTableTitle = sTableTitle + "<div  Style=/"z-index: 111; left: 600px; position: absolute; top: 352px/">" + oldReg + "</div>";

                }
                //输出身份证
                int length = CardNum.Length;
                int start = 272;
                for (int i = 0; i < length; i++)
                {
                    sTableTitle = sTableTitle + "<div  Style=/"z-index: 105; left: " + start.ToString() +  "px; position: absolute; top: 200px/">" + CardNum.Substring(i,1) + "</div>";
                    start = start + 18;
                }
                sTableTitle = sTableTitle + "</body>/n";
                sTableTitle = sTableTitle + "</html>/n";
                sw.WriteLine(sTableTitle);
                sw.Flush();
                sw.Close();
            }
        }
        catch
        {
            Response.Write("<script>alert(&apos;读取文件出错!&apos;)</script>");
        }
    }
public MyPrint()
{
//
// TODO: 在此处添加构造函数逻辑
//
        try
        {
            string urlSuffix = Context.Request.Url.Host;
            urlSuffix = urlSuffix + (Context.Request.Url.Port.ToString() == "" ? "" : ":" + Context.Request.Url.Port);
            urlSuffix = urlSuffix + (Context.Request.ApplicationPath.ToString() == "/" ? "" : Context.Request.ApplicationPath);
            pageUrlBase = @"http://" + urlSuffix;
        }
        catch
        {

        }
}
}

     ClearView函数是用来自动生成网页。里面输出身份证的时候,为了和表格对应精确采用了按位输出。
2.调用的方法
   print.name = this.TextBox2.Text;
        if (RadioButton1.Checked)
            print.sex = "男";
        else
            print.sex = "女";
        print.brithday = this.TextBox4.Text;
        print.tel = this.TextBox5.Text;
        print.country = this.DropDownList2.Text;
        print.type = this.DropDownList3.Text;
        print.oldReg = this.DropDownList4.Text;
        print.reg = this.DropDownList6.Text;
        print.address = this.TextBox13.Text;
        print.touchAddress = this.TextBox14.Text;
        print.CardName = "身份证";
        print.CardNum = this.TextBox3.Text;
        print.ClearView();
        string showOpen = "<script lanage=&apos;javascript&apos;>window.open(&apos;printwindow.htm&apos;,&apos;_blank&apos;);</script>";
        ScriptManager.RegisterClientScriptBlock(this.Button4, this.GetType(), "verygood", showOpen, false);
      这是提交页面上的一个“打印”按钮的响应事件。首先把页面上对应的字段传给打印类,然后调用ClearView来生成网页。最后,通过注册脚本的方式在新窗口中打开网页。我这里了AJAX所以用到了
    ScriptManager.RegisterClientScriptBlock(this.Button4, this.GetType(), "verygood", showOpen, false);这句,如果没用AJAX用这个就可以了
    RegisterClientScriptBlock("clientScript", showOpen);
3、用到的JAVASCRIPT
    <script language="Javascript">
    function preview()
    {
        window.print();
       self.close();
    }
    </script>
    打印之后能够自动关闭窗口。
    
    这样就基本实现了web套打。程序参考了 http://www.cnblogs.com/HelloSnoopy/articles/105475.html这篇文章。
 
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
本DataGridView打印控件和.NET打印控件5.6版(含报表模板设计组件)2014年6月22日修改完成,完全免费,在.NET2.0及以上环境下都可以使用(VB打印、C#打印都是可以的),有帮助文档与使用实例。 与上一版本的5.5版相比,新控件5.6版的主要更改如下: 1、增加了一个新打印组件SimpleReport组件,该组件与DGVPrint组件一样在运行时可进行打印参数设置,但比DGVPrint组件功能更强大,可以自动管理多个打印方案,在打印预览时可以自由在各个打印方案之间切换;可以在打印参数设置窗口中动态定义多表头,还可以像EasyReport组件一样设置和使用参数变量(具体使用效果参见实例程序); 2、解决了EasyReport组件在插入变量参数时,变量参数未排序导致查找不方便的问题; 3、在打印预览界面添加了简单的双面打印功能。(打印预览界面工具栏中的“打印\双面打印”菜单); 4、其他一些完善,比如DGVPrint组件中设置的行高无效等问题。 本控件特色: 1、强大的DataGridView打印功能,不仅可以以多种形式(普通打印、分栏打印、跨页打印、工资条打印)打印DGV表格,基本上能完全按DGV控件本身设置的格式如字体、字号、背景颜色、前景颜色、单元格对齐方式等打印出来,文字图像都可以打印,而且是完全根据表格当前的显示顺序进行打印的,基本上做到了所见即所得的打印。 2、报表设计功能。报表模板设计组件EasyReport与WebEasyReport组件可以设计普通报表、分组报表、打模板等,分别以DataGridView为数据源。控件的位置以毫米为计量单位,定位准确,很适合打单据设计。 3、强大的图表打印功能。5.2版控件新增了一个Chartlet的组件,使用非常方便,可以生成柱形图、饼图、折线图等多种图形,而且可以设置2D或3D效果,既可以在打印控件中打印出来,也可以在Graphics对象中显示。 4、分组汇总打印DataGridVeiw功能,每组还可以自动换新页打印,还可以自动增加行号。 5、强大的文本打印输出功能,控件提供多个文本打印重载函数,打印文本时,如果需要,控件会自动换行和换页打印输出。还增加了以指定行间距及字符间距打印文本的功能,可以用固定行距,也可以用单倍或多倍行距打印文本。 6、强大的绘图功能,基本上.NET的GDI+的绘图函数(如直线、矩形、路径、多边形、曲线等)都有,只有个别函数的名称有点区别。 7、支持同一文档多种版面格式打印(类似于Word中的节的功能):对同一份文档,不同的页面可以设置不同的格式(纸张大小、纸张方向、页边距),只需要在新增一页时在NewPage方法中指定要使用的页面格式即可,使用非常简单。 8、报表文件保存功能。本控件允许将当前打印预览的内容保存为报表文件,以后使用本控件重新打开该报表文件即可重现原来保存报表时的打印内容。 9、Excel导出功能,可以将DataGridView和GridView导出为Excel文件,5.2版控件还增加了不依赖Office的导出Excel功能,而且速度非常快,5.4版还增加了合并单元格的导出功能。 10、打印DataGridView时的打印方案保存与读取功能。可以将当前打印参数保存为打印方案文件,或者从保存的打印方案文件中读取打印参数。 11、水印打印功能。根据需要,可以在页面中打印或不打印以半透明空心文字打印水印。 12、强大的容器控件打印功能(DrawPanel函数)。借助该函数,您只需要在您的容器控件中设计好要打印的内容及打印内容的相对位置,控件轻松帮你打印出来(如果超过一页,控件会自动换页续打)。 13、特殊文字效果打印功能。控件具有打印浮雕文字、阴影文字、空心文字、块文字的功能。 14、页眉页脚中既可打印文字,也可打印图像,或者即打印图像又打印输出文字。 15、图像与图标打印输出功能。 16、多表头(跨行跨列的复杂表头)打印功能,多表头组件支持多表头显示与打印、单元格内容的合并显示、打印与导出。 17、自定义纸张支持功能。 18、纸张背景图片设置打印功能。 19、.NET4.0支持功能(是单独的一个文件)。 20、直接打印窗口中的TreeView控件功能。 21、打印窗口中的ListView功能。 22、RichTextBox控件的RTF文本打印功能。 23、斜线表头打印功能(5.4版新增)。 24、二维码打印功能(5.5版本增加)。 25、5.6版新增的SimpleReport组件允许您在一个方案文件中管理多个打印方案,在打印预览时能自由在各个打印方案之间切换。 我将持续改进该控件,并将不断推出控件的新版本,要查看或下载控件的升级版本,请登陆网站:http://myyouping.download.csdn.n
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值