当前位置: 代码迷 >> ASP.NET >> 100分 求B/S模式上发票套打解决方案
  详细解决方案

100分 求B/S模式上发票套打解决方案

热度:2853   发布时间:2013-02-25 00:00:00.0
100分 求B/S模式下发票套打解决方案
小弟试做了一个B/S架构的医院管理系统,但卡在了发票套打上面,
这个打印不需要预览而直接打印,而且打印也并非A4的纸,以前试用过水晶报表和grid++report,
但结果都不是很理想,水晶报表的打印只能在服务器上进行( PrintToPrinter() );
并且对于页面大小设置来说相当困难。
小弟在此请求哪位大虾能给一个解决B/S模式下无预览发票套打解决方案
分虽少了点,小弟在此感激不尽。。。
3Q



------解决方案--------------------------------------------------------
帮顶了。。。
------解决方案--------------------------------------------------------
可以尝试调用Excel打印,只是见别人用过
------解决方案--------------------------------------------------------
顶下
------解决方案--------------------------------------------------------
水晶报表
------解决方案--------------------------------------------------------
可以试着用javascript解决这个问题。
先加载要打印的页面。然后在页面加载完后,用javascript打印页面,打印完后用javascipt关闭打印页面。
至于不用预览,可以把要打印的页面放在一frame中。然后把这个frame隐藏就行了。
------解决方案--------------------------------------------------------
用Excel吧
------解决方案--------------------------------------------------------
探讨
可以试着用javascript解决这个问题。
先加载要打印的页面。然后在页面加载完后,用javascript打印页面,打印完后用javascipt关闭打印页面。
至于不用预览,可以把要打印的页面放在一frame中。然后把这个frame隐藏就行了。

------解决方案--------------------------------------------------------
BS客户端套打是不大容易实现,除非用ActiveX控件。
之前看到一个产品使用客户端excel来实现类似的功能,挺巧妙的
这个控件是要收费的,不过你只需参考打印部分就行了,不用他的控件
http://218.28.143.234/report/default.aspx?reportName=交叉表_1997年产品销售额.cr

看这个页面上的打印按钮和打印预览按钮,找到里面的脚本看看。
------解决方案--------------------------------------------------------
如果你使用vc++,开发一个套打ActiveX也许3天就完成(验收通过)了。如果使用vb(vb6、vb5)来开发ActiveX则更简单方便一些(例如在vb中将一个Form上的所有控件的屏幕图像打印到打印机上仅需要一条指令)。关键是,这两种工具你都开发过商品化小程序,那么看一下开发和调试网页ActiveX控件就会非常快(也许十分钟就可以完全学会)。

套打,首先要由程序选择打印机类型,然后驱动打印机进纸、打印头复位到初始状态,然后才开始打印。用户的电脑上可能有不止一款打印机驱动,默认打印机驱动也往往并不是套打的那个(例如经常是打印到A4纸的),你的程序需要首先遍历打印机驱动集合(在vb上是直接可以读取的一个数组),设置默认打印机驱动为套打所需要的那个,然后才打印,打印完成还要再把默认打印机驱动设置回原来的。
------解决方案--------------------------------------------------------
web是不允许网站随便驱动用户的外部设备的,所以不太可能直接了当地使用程序来控制外设(至少,浏览器会弹出一大堆确认画面让用户繁琐地操作)。所以,要开发这类功能,需要简单的AcriveX或者applet技术。
------解决方案--------------------------------------------------------
如果你用水晶报表服务器打印printToPrinter的话

这个自定义纸型在服务器的打印机处和客户端的打印机处都设置了吗?
------解决方案--------------------------------------------------------
晕,水晶报表是可以实现客户端套打的。即使是不预览直接打印也是可行的!
------解决方案--------------------------------------------------------
我也为这个问题困扰过。
最佳实践:AcriveX,可采用C++或delphi开发。
------解决方案--------------------------------------------------------
不要用水晶报表打印

直接打印页面的某个区域,我b/s套打单据就是这样的
------解决方案--------------------------------------------------------
可以将数据导出到excel再打印,不知道合不合要求.
下面是两种从asp.net导出的方法,仅供参考!
C# code
1、将整个html全部输出execl Response.Clear();        Response.Buffer=   true;        Response.AppendHeader("Content-Disposition","attachment;filename="+DateTime.Now.ToString    ("yyyyMMdd")+".xls");              Response.ContentEncoding=System.Text.Encoding.UTF8;      Response.ContentType   =   "application/vnd.ms-excel";      this.EnableViewState   =   false;  2、将DataGrid控件中的数据导出ExeclSystem.Web.UI.Control ctl=this.DataGrid1;//DataGrid1是你在窗体中拖放的控件HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=Excel.xls"); HttpContext.Current.Response.Charset ="UTF-8";     HttpContext.Current.Response.ContentEncoding =System.Text.Encoding.Default; HttpContext.Current.Response.ContentType ="application/ms-excel";ctl.Page.EnableViewState =false;    System.IO.StringWriter  tw = new System.IO.StringWriter() ; System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter (tw); ctl.RenderControl(hw); HttpContext.Current.Response.Write(tw.ToString()); HttpContext.Current.Response.End(); 3、将DataSet中的数据导出Execlpublic  void CreateExcel(DataSet ds,string FileName)  {  HttpResponse resp;  resp = Page.Response;  resp.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");  resp.AppendHeader("Content-Disposition", "attachment;filename="+FileName);     string colHeaders= "", ls_item="";     //定义表对象与行对象,同时用DataSet对其值进行初始化  DataTable dt=ds.Tables[0];  DataRow[] myRow=dt.Select();//可以类似dt.Select("id>10")之形式达到数据筛选目的        int i=0;         int cl=dt.Columns.Count;      //取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符  for(i=0;i  { if(i==(cl-1))//最后一列,加n { colHeaders +=dt.Columns[i].Caption.ToString() +"n";  } else { colHeaders+=dt.Columns[i].Caption.ToString()+"t";  }        } resp.Write(colHeaders);  //向HTTP输出流中写入取得的数据信息     //逐行处理数据    foreach(DataRow row in myRow)  {      //当前行数据写入HTTP输出流,并且置空ls_item以便下行数据      for(i=0;i  { if(i==(cl-1))//最后一列,加n { ls_item +=row[i].ToString()+"n";  } else { ls_item+=row[i].ToString()+"t";  }   } resp.Write(ls_item);  ls_item="";      }     resp.End();   }
  相关解决方案