指定Web打印的打印机

    前一段时间我帮一个朋友开发了一个Web快递单打印程序,程序本身很简单的,就几千行代码,我一个周末就可以搞定,因为太简单了,我都只把它叫程序,而不叫系统,呵呵。但朋友使用后,提出了一个比较中肯的需求,快递单是针式打印机打印,而平时的文档一般是A4纸,通过激光打印机打印,我把他们的默认打印机设为针式打印机,这样虽然可以在打印快递单时方便的直接打印(不需要打印预览)出快递单,但他们在打印文档时,已经习惯了不选择打印机,直接就打印,这样就经常把要打印的文档发到针式打印机上打印,浪费了不少快递单。我通过调查发现,现在一般的公司都会装两种打印机,一种是针式打印机,用来打印各种单据和发票,一种是激光喷墨之类的打印机用来打印文档,正常情况下是把文档的打印机设为默认打印机。

    我想我们作为程序员,不管系统的大小,简单和复杂,良好的用户体验是我们追求的设计目标。我们做程序和系统,本身就是去减轻用户的工作,而不是因为使用了我们所开发的程序和系统,而使工作变得更复杂,在程序的操作方面,能让用户少选一下就应该做到少选一下,能让用户少点一次就应该做到少点一次,能让用户少出错就应该做到少出错。

    我在这种思想的指导下,对这个小东西也精益求精吧,呵呵。这个Web打印控件是我自己设计的,我就想在原来的基础上增加指定打印机的功能,这样用户就不用再为打印机选来选去。折腾了好几个小时,终于可以指定打印机了,但这个打印机的名称是在程序中写死的,我又觉得不方便,特别是对于网络打印机,得把“\”改为“\\”,挺不方便的,打印机的名称一般又比较长,中间还有空格,很容易输错了,如果输错了,则指定的打印机无效了。我就想好事做到底吧,干脆在控件中把本地的打印机列表抓出来,然后作为一个下拉框,供用户选择,再把选择的结果保存下来,这样既不会出错,又很灵活,如果用户的打印机重装了或者移到另外的电脑上,只要自己选择一下就好了,也不用我再改程序了。

    控件中指定打印机的示例代码如下:

 

控件中指定打印机的示例代码
        protected void BtnDepositPrint_Click(object sender, EventArgs e)
{
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.Printer='\\\\192.168.1.88\\Epson LQ-300K';"
+ " ObjPrintMange.PrintReport('"
+ FileValue + "' , '"
+ ParaName + "', '"
+ ParaValue + "', '"
+ PrintValue + "', '', '', '', '', '');"
+ "ObjPrintMange = null; window.location='./Default.aspx'; } </script>"; //window.location转向新的网页
ScriptStr = ScriptStr.Replace(System.Environment.NewLine, string.Empty);

Response.Write(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');
var ObjCmbPrinterList = document.getElementById('CmbPrinterList');
var strPrinterList = ObjPrintMange.PrinterList;
var arrayPrinterList = strPrinterList.split(';');
ObjCmbPrinterList.innerHTML = '';
for (var i = 0; i < arrayPrinterList.length - 1; i++) {
ObjCmbPrinterList[i] = new Option(arrayPrinterList[i], 0);
}

ObjPrintMange = null;
}

</script>

    指定Web打印的打印机,对于打印预览方式,系统则把指定打印机设为首选打印机;对于直接打印,系统则把打印任务直接分配给指定打印机。若为空则为默认打印机。指定的打印机必须是客户端电脑已安装好的,本地打印机和网络打印机都可以,对于网络打印机的名称,注意“\”改为“\\”,比如:ObjPrintMange.Printer='\\\\192.168.1.88\\Epson LQ-300K'; ,若指定的打印机不存在,则还是默认的打印机。

   

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


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

 

 

 

 

 

原文地址:https://www.cnblogs.com/dong0738/p/2200539.html