• 获取Web打印的实际打印次数


        最近在一个Web开发项目中,用户提出一个比较特殊的需求:就是在报表打印时,需要记录哪一个人在什么时候真正打印了哪一份报表,报表预览则可以不记录。用户的这个需求在需要对报表的打印进行管理的场合是比较普遍的,作为管理员,对于比较重要的报表,肯定想知道谁在什么时候真正打印了报表。

       对于这种打印需求,一般的报表打印方案是无能为力的,无法知道用户在报表预览后是否真正打印了。 我想就是在C/S架构下的程序,调用水晶报表之类的控件进行打印,按一般思维解决这个问题也是比较困难的。 这因为一般打印控件的预览和打印的功能是一体的,预览后的真正打印时没有向调用者发送打印的消息。

        对于这个难题,我思考了好久,终于在我所设计的一个Web打印控件实现了此需求, 在用户预览报表后,单击打印图标,在弹出的打印窗口,用户单击“确认”按钮开始打印时,控件向服务端发送一个HTTPPOST消息,这样服务端收到此消息后就可以记录在什么时候打印了报表,对于打印了什么报表,是何人打印的,我们可以在POST消息中加上这两个参数或者用Session就可以解决这个问题。

         下面我详细的讲解一下怎样利用我设计的Web打印控件实现获取Web打印的实际打印次数。讲解以ASP.NET为例,当然其它语言也可以举一反三,很容易实现。因为调用打印控件统一是JavaScirpt,提交服务器的数据是Http协议的Post方式,这些都是通用的。

         获取Web打印的实际打印次数的部分代码如下:

     

    获取Web打印的实际打印次数
    string FileValue, PrintValue, ParaName, ParaValue;

    FileValue
    = FileToString(".\\Frp\\DepositAmt.fr3");
    ParaName
    ="ShopName`~PrintDepositAdd`~PrintPaperNo`~Title"; //`~为各参数的分隔符
    ParaValue ="测试酒楼"
    +"`~说明:本单据为贵客押金收取凭证,盖章有效。退房时请出示,遗失者自负,请妥善保存。退房时间为12:00时,延时退房18:00时以前按半天房费收取,18:00时以后算全天房价。押金单有效期为一个月,过期作废。 贵重物品请交前台寄存,未寄存丢失自负。 谢谢!"
    +"`~身份证:4325011980639512"
    +"`~押金单";

    SqlConnection ConPrintTest
    =new SqlConnection(ConfigurationManager.ConnectionStrings["PrintTestConnectionString"].ToString());
    ConPrintTest.Open();
    DataSet DsCashLog
    =new DataSet();
    SqlDataAdapter DaCashLog
    =new SqlDataAdapter("Select top 1 CashNo, CashDate, CashAmt, PayName, GuestName, RoomNo, ItemRemark, CashUserName, Remark From CashLog", ConPrintTest);
    DaCashLog.FillSchema(DsCashLog, SchemaType.Source,
    "CashLog");
    DaCashLog.Fill(DsCashLog,
    "CashLog");

    PrintValue
    = TableToXml(DsCashLog.Tables["CashLog"]);

    DsCashLog.Dispose();
    ConPrintTest.Close();

    string ScriptStr;

    ScriptStr
    ="<script language='javascript'>window.onload = function() { try { var ObjPrintMange = new ActiveXObject('WebPrint.WebPrintUnit'); } catch(e) { if( confirm('打印控件未安装,现在下载吗?') ) { window.location='./PrintActivex.exe'; } return; } var OldVersion=ObjPrintMange.Version; NewVerion='5.0(2011-08-01)'; if(OldVersion < NewVerion) { ObjPrintMange = null; alert('打印控件需升级。请先进行下载,下载后关闭IE,然后安装升级版。'); window.location='./PrintActivex.exe'; return; } "
    +" ObjPrintMange.CheckReg('公司名称', '3B8E5B998A3125EE89983EA940BB2AEE'); "//注册码
    +" ObjPrintMange.PrintURL='http://www.xinyuerj.com/ASPPost/PrintNum.asp?FileName=DepsitAmt.fr3'; "
    +"ObjPrintMange.ShowReport('"
    + FileValue +"' , '"
    + ParaName +"', '"
    + ParaValue +"', '"
    + PrintValue +"', '', '', '', '', '');"
    +"ObjPrintMange = null; } </script>";
    ScriptStr
    = ScriptStr.Replace(System.Environment.NewLine, string.Empty);

    Response.Write(ScriptStr);

     

     

       PrintURL属性,设置此属性,则在报表打印时,在弹出的选择打印机的窗口后点击“确定”按钮时,通过HttpPost方式直接提交到所设置的URL页面,用户可以在URL处理用户已打印的份数。Post的字段名指定为PrintCopy,此参数为用户打印时所选择的份数,默认为1

       接收实际打印的消息的代码如下:

    接收实际打印次数
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.IO;
    using System.Text;

    namespace Upload
    {
    publicpartialclass Show : System.Web.UI.Page
    {
    protectedvoid Page_Load(object sender, EventArgs e)
    {
    string FileName, PrintCopy;

    FileName
    = Request.QueryString["FileName"];
    PrintCopy
    = Request.Form["PrintCopy"];

    WriteReportFile(FileName, PrintCopy);

    Response.Write(
    "File Name"+ FileName);
    Response.Write(
    "Print Copy"+ PrintCopy);
    }

    privatevoid WriteReportFile(string FileName, string PrintCopy)
    {
    if ( FileName ==null|| FileName ==""|| FileValue ==null||FileValue =="")
    return;

    File.WriteAllText(Server.MapPath(FileName), PrintCopy);
    }
    }
    }

    报表控件跨浏览支持,支持常用的Chrome、火狐、IE、QQ浏览器、搜狗浏览器、360浏览器。   

    有什么问题请加入QQ群:218392762或者请直接Q我:12988672 或者请加我的微信:dong0738


    报表预览、编辑和下载的网址:  http://www.lc-simple.com/PrintTest/

                             

                             

                               

     

  • 相关阅读:
    POI处理Excel工具类
    Mac打开隐藏文件夹
    markdown语法
    U盘分区合并
    数组
    Java插入到mysql数据库显示问号?
    使用vmware打开别人提供好的vmx没反应怎么办?
    求长方形的外接圆
    读取mysql数据库
    excel对列的常用操作
  • 原文地址:https://www.cnblogs.com/dong0738/p/2176023.html
Copyright © 2020-2023  润新知