打印服务器端,要下在的文件都可以,只要是文件就可以,不能是HTM页面.

解决方案 »

  1.   

    只会用IE自带的打印功能,感觉一般也够用了,在这里算是提醒一下大家使用时要注意的问题吧首先在网页中添加:     <OBJECT id="WebBrowser" height="0" width="0" classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"
          VIEWASTEXT>
         </OBJECT>然后就可以依次加入功能按钮了:<input onclick="document.all.WebBrowser.ExecWB(6,1)" type="button" value="打印"> <input onclick="document.all.WebBrowser.ExecWB(6,6)" type="button" value="直接打印">
         <input onclick="document.all.WebBrowser.ExecWB(8,1)" type="button" value="页面设置">
         <input onclick="document.all.WebBrowser.ExecWB(7,1)" type="button" value="打印预览">&nbsp;<INPUT type="button" value="关闭窗口" onclick="javascript:window.close()">将这两块东西放到<center class=noprint></center>就不会打印这些按钮了。当然要定义noprint了:<style media="print">.Noprint { DISPLAY: none }</style>只要把不想打印的东西的css设置成noprint就可以了。现在就实现了基本的web打印,需要注意的情况如下:必须将ie的internet选项的安全设置中对于没有标记为安全的ActiveX控件进行...设置成提示或者启用,否则会报错,导致不可用。
    如果在vs.net编辑环境下编辑该页面,它经常自动的给object添加多余的参数,有了这些东西,打印就会出错,所以要记得最后保存的时候删除它们。
    为了简便并且达到最好的效果,我们可以在一个页面实现编辑和打印,这时候会需要很多的textbox,我们把它的css设置成.edittext 
    {
     overflow-y:visible;
     width: 100%;
     border-top: none;
     border-right: none;
     border-bottom: none;
     border-left: none;
    }就可以实现在打印的时候不显示边框和multiline的textbox不显示滚动条了。还有一些小经验就是在设置标格宽度的时候,对于A4纸张,横打用920,竖打用640,效果最好。
      

  2.   

    实现Web打印的方案,有些地方还需完善。
    using System;
    using System.Data;
    using System.Web;
    using System.Text;
    using System.Collections;
    using System.Web.UI;
    using System.Data.SqlClient;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.IO;namespace WebPrint
    {
    /**//// <summary>
    /// 这是一个完全利用IE自身对象实现Web打印的方案,主体数据来源于DataGrid控件绑定的数据
    /// 同时,用户可以自定义标题、页眉、页脚、每页打印行数等一般报表的基本要素
    /// 作者:KG 
    /// 日期:2005.1.1
    /// 来源:www.domanage.com.
    /// </summary>
    public class clsPrint: System.Web.UI.Page
    {
    private string[] sShoulderLeft;
    private string[] sShoulderCenter;
    private string[] sShoulderRight; private string[] sFooterLeft;
    private string[] sFooterCenter;
    private string[] sFooterRight; private string sPageTitle = "";
    private string sSpanColumnList = "";private int iPageNumber = 30;private DataGrid MyDataGrid;private static string pageUrlBase; //Page基本的URLpublic clsPrint()
    {
    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
    {
    // for design time

    }
    每页显示的行数#region 每页显示的行数
    /**//// <summary>
    /// 每页显示的行数
    /// </summary>
    public int PageNumber 
    {
    get 

    return iPageNumber; 
    }
    set 

    iPageNumber =value;
    }
    }
    #endregion 页的标题#region 页的标题
    /**//// <summary>
    /// 页的标题
    /// </summary>
    public string PageTitle
    {
    get 

    return sPageTitle; 
    }
    set 

    sPageTitle =value;
    }
    }
    #endregion网格控键要合并的列集合#region 网格控键要合并的列集合
    /**//// <summary>
    /// 网格控键要合并的列集合,格式如: 1,2,3,4用逗号分割
    /// </summary>
    public string SpanColumnList
    {
    get 

    return sSpanColumnList; 
    }
    set 

    sSpanColumnList =value;
    }
    }
    #endregion 左页眉标题,数组类型[0][1] 显示顺序从上至下#region 左页眉标题,数组类型[0][1] 显示顺序从上至下
    /**//// <summary>
    /// 页的标题
    /// </summary>
    public string[] ShoulderLeft
    {
    get 

    return sShoulderLeft; 
    }
    set 

    sShoulderLeft =value;
    }
    }
    #endregion 中页眉标题,数组类型[0][1] 显示顺序从上至下#region 中页眉标题,数组类型[0][1] 显示顺序从上至下
    /**//// <summary>
    /// 页的标题
    /// </summary>
    public string[] ShoulderCenter
    {
    get 

    return sShoulderCenter; 
    }
    set 

    sShoulderCenter =value;
    }
    }
    #endregion
      

  3.   

    右页眉标题,数组类型[0][1] 显示顺序从上至下#region 右页眉标题,数组类型[0][1] 显示顺序从上至下
    /**//// <summary>
    /// 页的标题
    /// </summary>
    public string[] ShoulderRight
    {
    get 

    return sShoulderRight; 
    }
    set 

    sShoulderRight =value;
    }
    }
    #endregion 左页脚标题,数组类型[0][1] 显示顺序从上至下#region 左页脚标题,数组类型[0][1] 显示顺序从上至下
    /**//// <summary>
    /// 页的标题
    /// </summary>
    public string[] FooterLeft
    {
    get 

    return sFooterLeft; 
    }
    set 

    sFooterLeft =value;
    }
    }
    #endregion 中页脚标题,数组类型[0][1] 显示顺序从上至下#region 中页脚标题,数组类型[0][1] 显示顺序从上至下
    /**//// <summary>
    /// 页的标题
    /// </summary>
    public string[] FooterCenter
    {
    get 

    return sFooterCenter; 
    }
    set 

    sFooterCenter =value;
    }
    }
    #endregion 右页脚标题,数组类型[0][1] 显示顺序从上至下#region 右页脚标题,数组类型[0][1] 显示顺序从上至下
    /**//// <summary>
    /// 页的标题
    /// </summary>
    public string[] FooterRight
    {
    get 

    return sFooterRight; 
    }
    set 

    sFooterRight =value;
    }
    }
    #endregion 打印的网格控件名称#region 打印的网格控件名称
    /**//// <summary>
    /// 打印的网格控件名称
    /// </summary>
    public DataGrid dgDataGrid
    {
    get 

    return MyDataGrid; 
    }
    set 

    MyDataGrid =value;
    }
    }
    #endregion 修改模板文件的内容,构造打印数据,重写打印模板#region 修改模板文件的内容,构造打印数据,重写打印模板
    /**//// <summary>
    /// 修改模板文件的内容,构造打印数据,重写打印模板
    /// </summary>
    public void PrintView()
    {
    ClearView();StringBuilder htmltext=new StringBuilder(); 
    try 

    using (StreamReader sr = new StreamReader( Server.MapPath(Context.Request.ApplicationPath) + "\\printWindow.htm")) 

    String line; 
    while ((line = sr.ReadLine()) != null) 

    htmltext.Append(line); 

    sr.Close(); 


    catch 

    Response.Write("<Script>alert('读取文件错误')</Script>"); 
    } //----------替换htm里的标记为你想加的内容 htmltext.Replace("Model",PintPage()); //----------生成htm文件------------------―― 
    try 

    using(StreamWriter sw=new StreamWriter( Server.MapPath(Context.Request.ApplicationPath) + "\\printWindow.htm",false,System.Text.Encoding.GetEncoding("GB2312"))) 

    sw.WriteLine(htmltext); 
    sw.Flush(); 
    sw.Close(); 
    //Response.Write("<script languge='javascript'>alert('111');window.open('"+pageUrlBase+"/printWindow.htm','_blank');</script>"); 


    catch 

    Response.Write ("The file could not be wirte:"); 

    //Response.Write("<script languge='javascript'>alert('111');window.open('"+pageUrlBase+"/printWindow.htm','_blank');</script>");
    //Page.RegisterStartupScript("show111", "<script languge='javascript'>alert('"+pageUrlBase+"');window.open('"+pageUrlBase+"/printWindow.htm','_blank');</script>");
    }
    #endregion 打印主函数,构造要打印的页面的所有打印项目(标题,列标题,网格数据,shoulder,footer)#region 打印主函数,构造要打印的页面的所有打印项目(标题,列标题,网格数据,shoulder,footer)
    /**//// <summary>
    /// 打印主函数
    /// </summary>
    /// <returns></returns>
    private string PintPage()
    {
    int iTableIndex = 1;
    string[] ColumnList ; string sTable="<object ID='WebBrowser' WIDTH=0 HEIGHT=0 CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'></object>\n\n"; //添加页的标题
    sTable = sTable + AddPageTitle(); //添加页眉
    sTable = sTable + AddShoulder(); //添加网格数据第一页
    sTable = sTable + "<table id=\"table1\" class=\"print-body\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\">";
    //添加该页的列标题
    sTable = sTable + AddTableTitle(); //初始化行号
    int iStartItemIndex = 0;
    int iItemIndex = iStartItemIndex;
    //主体数据
    int i = 0;
    DataTable dt = new DataTable();
    if(this.MyDataGrid.DataSource is DataSet)
    {
    dt = ((DataSet)this.MyDataGrid.DataSource).Tables[0];
    }
    else if( this.MyDataGrid.DataSource is DataView)
    {
    dt=((DataView)this.MyDataGrid.DataSource).Table;
    }
    else if(this.MyDataGrid.DataSource is DataTable)
    {
    dt = ((DataTable)this.MyDataGrid.DataSource);
    } foreach(DataRow row in dt.Rows)
    {
    if(i > 0 && i%iPageNumber==0)
    {
    //上一页结束
    sTable = sTable + "</table>";
    if(sSpanColumnList!="")
    {
    ColumnList = sSpanColumnList.Split(',');
    for(int ii = 0 ; ii < ColumnList.Length ; ii++)
    {
    sTable = sTable + "<script languge='javascript'>TableRowSpan(\"table"+iTableIndex.ToString()+"\","+ColumnList[ii].ToString()+");</script>\n\n";
    }
    } sTable = sTable + AddFooter();
    //换页
    sTable = sTable + AddPageBreak();
    //添加页的标题
    sTable = sTable + AddPageTitle();
    //添加页眉
    sTable = sTable + AddShoulder();
    iTableIndex++;
    //创建新一轮的表格
    sTable = sTable + "<table id=\"table"+iTableIndex.ToString()+"\" class=\"print-body\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\">";
    //添加该页的列标题
    sTable = sTable + AddTableTitle();
    }
    //将记录添加到表格的一行中
    sTable = sTable + AddItemToTable(row);
    //行号加一
    iItemIndex++;
    i++;
    } sTable = sTable + "</table>\n\n";
    if(sSpanColumnList!="")
    {
    ColumnList = sSpanColumnList.Split(',');
    for(int ii = 0 ; ii < ColumnList.Length ; ii++)
    {
    sTable = sTable + "<script languge='javascript'>TableRowSpan(\"table"+iTableIndex.ToString()+"\","+ColumnList[ii].ToString()+");</script>\n\n";
    //sTable = sTable + "<script languge='javascript'>TableRowSpan(\"table"+iTableIndex.ToString()+"\",0);</script>\n\n";
    }
    }
    //添加页脚
    sTable = sTable + AddFooter(); sTable = sTable + "<script languge='javascript'>WebBrowser.ExecWB(7,1); window.opener=null;window.close();</script>"; return sTable ;
    }
    #endregion
      

  4.   

    http://old.blog.edu.cn/user3/janpo/archives/2006/1330443.shtml
      

  5.   

    谢谢您的热心,但我想要打印的是一个文件,用STREAM冲出来的文件,这个文件是个DWG图纸或者一个WORD文档.怎么弄?
      

  6.   

    FineReport有完美打印解决方案:服务器端打印:客户端打印方式(flash打印,applet打印,pdf打印)