随笔 - 8  文章 - 0 评论 - 266 阅读 - 78843
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

摘要: 怎么设计一个高效、可靠的跨浏览器的打印程序? 阅读全文
posted @ 2019-06-08 15:36 Web打印 阅读(5548) 评论(7) 推荐(5) 编辑

    前一段时间我帮一个朋友开发了一个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/

 

 

 

 

 

 

 

 

posted @ 2011-10-07 14:14 Web打印 阅读(12953) 评论(9) 推荐(2) 编辑
摘要: 最近在一个Web开发项目中,用户提出一个比较特殊的需求:就是在报表打印时,需要记录哪一个人在什么时候真正打印了哪一份报表,报表预览则可以不记录。用户的这个需求在需要对报表的打印进行管理的场合是比较普遍的,作为管理员,对于比较重要的报表,肯定想知道谁在什么时候真正打印了报表。 对于这种打印需求,一般的 阅读全文
posted @ 2011-09-14 12:47 Web打印 阅读(6121) 评论(12) 推荐(1) 编辑
摘要: 听到姑妈去世的消息后,特写此文纪念我的姑妈。 阅读全文
posted @ 2011-08-22 22:48 Web打印 阅读(1614) 评论(2) 推荐(4) 编辑
摘要: 我在一个多月之前换了一个工作,搞金融方面的程序化交易软件,第一个工作任务就是解析深圳交易所和上海交易所的数据,深交所的数据是STEP协议,是纯字符的TCP/IP流,每秒的流量达200多K,接收数据的客户端一定要设计合理,不然这么大的数据流就死定了。而上证所的数据是采用金融行业最先进的STEP/FIX/FAST协议,这数据流比STEP协议压缩了80%,解析这数据可大费我的脑精,找别的公司帮忙,人家开价每人每天8000元,还只是讲解协议,不提供源代码。没办法,硬着头皮上,生吞活剥的读完了那一百多页英文,终于懂得了协议的原理,然后再加上别人公司的一点提醒,终于把那该死的数据解析出来。以后要是有朋友. 阅读全文
posted @ 2011-06-19 22:00 Web打印 阅读(12170) 评论(15) 推荐(1) 编辑
摘要: 我在最近主持开发的人力资源管理系统中遇到一个新的问题:就是最终用户要能够设计和编辑报表。在人力资源管理系统中有一个基本的功能,就是编辑和打印员工的工作证,不同职务的员工的工作证可能不一样,同一个员工不同工作时期(比如实习员工、正式员工)的工作证也可能不一样。项目方要求我们一定要做到操作员可以在线设计 阅读全文
posted @ 2011-03-01 15:57 Web打印 阅读(16797) 评论(17) 推荐(4) 编辑
摘要: 这几天,我一直在研究Web打印,我觉得我的设计思路是对的。我们搞软件设计,无论是面对最终用户,还是面对程序员,良好的用户体验是软件成败的关键因素。具体对于打印设计来说,就是能用最少的代码,最少的时间设计出用户所需要的报表。现在的程序员大部分是从C/S架构走过来的,对于C/S架构下,丰富多彩、快捷方便 阅读全文
posted @ 2011-01-18 11:20 Web打印 阅读(10654) 评论(140) 推荐(9) 编辑
摘要: 我前一段时间开发一个B/S项目,需要用到打印功能,如是上网到处查找有关Web打印的控件(呵呵,我向来比较喜欢使用成熟的控件,这样用不着自己去开发,自己开发很多时候是费力不讨好,再说一个三五几百块的注册费用,俺还是付得起,自己去搞费上几天功夫,其工钱远不止这个数。),可是找来找去,挺让我失望的,真没想 阅读全文
posted @ 2011-01-04 14:34 Web打印 阅读(12986) 评论(64) 推荐(7) 编辑
点击右上角即可分享
微信分享提示