多台打印机同时打印
问题描述:后台系统的多单单据需要各自对应不同的打印机,并且同时打印(LQ-690K 2台,hp激光打印2台)。
一开始的功能是直接在各个单据的页面上直接放置打印按钮来打印,最终提出的需求是为了节约时间,提高打印速度,要多台打印机同时连接电脑,每台对应一种单据,同时打印。
后台是基于j2ee的,web打印方式也就那几种,一是用js,二就是用控件。初始的打印按钮使用window.print()来打印,已经满足不了要求,需要有新的方式来实现.中间走了许多弯路,现在将过程中一些思路整理了下:
1、想控制多台打印机,只好在客户端电脑放置一个java程序,使用java的打印api,从服务器获取html内容输出到打印机,但是查看java打印api的使用,很多都局限于对2d图形的打印(查了很多资料实现不了对html,pdf的直接打印)。
2、中间试图用js存储html到本地,转成pdf打印,最后发现对于分页,打印都是有问题。
时间有限,最后回来最初的选择上来,js打印基本是不用指望了,那就控件了,一开始没有使用控件是打个打印觉得没必要买控件(大部分功能完善点的都要收费吧)。不过这时候有需要只好找一个,杰表看了貌似有点贵,最后选Lodop来,暂时是会输出一行水印。
最终的思路就是调用控件针对不同的URL,分别指定到指定序号的打印机打印。考虑到如果有多个地方使用,所以序号的指定放到客户端电脑了。将打印机序号写到一个文本文件中,页面上使用js来读取打印机序号。
//获取本地txt文件内容 function getPrinter(){ var fso, tf; fso = new ActiveXObject("Scripting.FileSystemObject"); tf = fso.OpenTextFile("c://printer.txt",1); var content = ""; if(!tf.AtEndOfStream) { content =tf.ReadAll(); } tf.Close(); return content; }
//打印函数 function order(){ var c = getPrinter(); var arr = c.split(","); var index = arr[2] if(LODOP.SET_PRINTER_INDEX(index)){ LODOP.SET_PRINT_PAGESIZE(1,0,0,"A4"); LODOP.ADD_PRINT_URL("2.5cm",15,"20.2cm","100%","${basePath }order.do?method=orderPackagePrintBatch&poid=${tPickingOrder.id}"); LODOP.PRINT(); } }
基本实现了预期的功能。(唯一存在的问题是,现场反馈的针式打印机经常要重启才能打印,查一下,估计是usb供电问题)