关于使用Lodop的经验之谈

文章背景

作者接触lodop大概是从2018年年初,由于公司业务线调整,准备开发一款关于国际旅行入境手续办理的终端设备,起初公司决定让安卓工程师实现,后来评估说实现不了。最后决定让前端工程师实现。接到任务后,最开始想要用原生JavaScript实现,经过评估之后发现原生不仅功能单一且效率低,一些复杂的场景实现不了。经过一系列评估分析,最终选择使用LODOP这款JavaScript扩展来实现。

写作目的:

作者在使用LODOP开发过程中没有相关成型案例可参考。只能一遍遍熟读文档,正所谓一步一个坎,写这篇文章的目的就是为了帮助有相关开发需求的开发者有个可借鉴和参考的案例。少踩坑,规避作者曾经经历过的痛苦过程。

项目简介:

作者开发的这款设备,主要集泰国、越南、新加坡、老挝、菲律宾、柬埔寨、日本、韩国、缅甸、摩洛哥、美国等国家入境手续的的办理以及证件照和境外保险单的打印等功能。

场景分析:

场景分析开始之前首先把开发环境搭起来步骤如下:
1.首先下载并安装LODOP
2.安装相关打印机驱动
3.项目中引入相关文件(CLodopfuncs.js || LodopFuncs.js)
4.就可以开启lodop开发之旅了
如果不知道安装包和文件请搜索LODOP官网

场景一:

我要去打印泰国的入境手续,泰国的入境资料有入境卡和落地签,落地签上需要2寸证件照一张。这里就涉及到一个订单同时调启2~3台打印机同时工作的情况。

//实现打印的代码                
let LODOP;
LODOP.PRINT_INIT("泰国入境单");//打印机初始化
LODOP.SET_PRINTER_INDEX(2);//指定打印机(数字2通过[指定打印机](http://www.lodop.net/demolist/PrintSample7.html)获取)
LODOP.SET_PRINT_MODE("PRINT_DEFAULTSOURCE",1);//控制打印机的纸张来源(自动、纸盒、手动等);
LODOP.SET_PRINT_PAGESIZE(2,"","","A5");//指定打印机的纸盒纸张打印方向纸张大小(A5是纸张类型,打印机可手动设置,通过设置打印机纸张类型来指定纸盒)
LODOP.SET_PRINT_MODE("CATCH_PRINT_STATUS",true);//状态捕获
LODOP.SET_PRINT_MODE("RESELECT_PRINTER",true);//设置是否可以重新选择打印机。
LODOP.SET_PRINT_MODE("RESELECT_PAGESIZE",true);//设置是否可以重新选择纸张。
LODOP.ADD_PRINT_HTML();
ThailandEntry(surname,name)//要打印内容的方法
LODOP.PRINT();//执行打印
//实现要打印内容的代码
ThailandEntry(surname,name){
LODOP = getLodop();
LODOP.SET_PRINT_PAGESIZE(2,2100,2970,"");
LODOP.SET_PRINT_MODE("PRINT_NOCOLLATE",1);//获取状态码很关键的一句话
LODOP.ADD_PRINT_TEXT(274,309,80,16,surname);//打印的内容和位置设置
LODOP.SET_PRINT_STYLEA(0,"FontSize",12);//打印内容的样式设置
LODOP.ADD_PRINT_TEXT(305,329,120,16,name);
LODOP.SET_PRINT_STYLEA(0,"FontSize",12);
}

ThailandEntry函数的代码可以通过打印设计直接生成代码
落地签和入境卡代码类似对打印机和纸盒的指定不同
照片和上面稍微有差别

LODOP.SET_PRINT_PAGESIZE(1,1480,2100,"");//设定纸张类型
LODOP.SET_PRINTER_INDEX(1);//指定打印机
LODOP.SET_PRINT_MODE("CATCH_PRINT_STATUS",true);//状态捕获
LODOP.SET_PRINT_MODE("RESELECT_PRINTER",true);//设置是否可以重新选择打印机。
LODOP.SET_PRINT_MODE("RESELECT_PAGESIZE",true);//设置是否可以重新选择纸张。
let ImageStr=$(".imagesFrame").html('
' +'' +'
'); LODOP.ADD_PRINT_HTM(0,0,1020,1600,ImageStr);//和入境卡和落地签差别 LODOP.PRINT();//打印

重要的事情说三遍:不要试图通过css样式去控制img元素的尺寸(后果就是图片模糊失真)解决方法:直接通过手动设置打印机的排版模式

场景二:

当我们要打印柬埔寨的入境资料分别有出入境卡、落地申请表、海关申报单、证件照。需要在落地签上追加一个二维码对接柬埔寨入境签证预审查与发放控制系统(抖个机灵此系统也是作者开发的)

ADD_PRINT_BARCODE(Top,Left,Width,Height,BarCodeType,BarCodeValue);//参数介绍
Top 对应条码左上角到页面的顶部距离
Left 对应的条码左上角到页面左侧的距离
Width 条码的总宽度,计量单位px(1px=1/96英寸)
Height 条码的总高度(一维条码时包括文字高度)
BarCodeType条码的类型(规制)名称
BarCodeValue 条码值(要获取的信息)

以上代码追加到打印内容的函数中就可以了,具体使用条码规则请参照打印条码

场景三:

当我要打印越南入境资料,越南入境资料有落地签和照片,但是越南落地签需要正反两面都要填写信息,打印机只支持A4纸正反两面打印。

SET_PRINT_MODE("PRINT_DUPLEX",2);0-不控制 1-不双面 2-双面(长边装订) 3-小册子双面(短边装订_长边水平)
SET_PRINT_MODE("PRINT_DEFAULTSOURCE",7);1-纸盒  4-手动 7-自动 0-不控制

上面表示打印机自动双面打印(想要详细了解双面打印请参考双面打印)

function VietnamLandingPrint (Name,...args){
            LODOP = getLodop();
            LODOP.SET_PRINT_PAGESIZE(0,0,0,"A4");//指定纸张类型和纸盒
            //正面内容
            LODOP.ADD_PRINT_TEXT(190,240,173,22,Name);
            LODOP.SET_PRINT_STYLEA(0,"FontSize",12);
            .............
            LODOP.NewPage();//区分正面和反面要打印的信息
           //背面内容
             LODOP.ADD_PRINT_TEXT(630,395,183,22,EntCity);
             LODOP.SET_PRINT_STYLEA(0,"FontSize",12);
             .................
}

以上内容是双面打印内容的方法设置

场景四:

在开发过程中肯定遇到过打印队列中任务多纸张不够的情况,这个时候获取打印机状态是非常有必要的。

LODOP.SET_PRINT_MODE("CATCH_PRINT_STATUS",true);//获取JOB代码
LODOP.GET_VALUE("PRINT_STATUS_XXX","JOB代码值")//通过JOB代码获取打印状态信息及最终结果

注意有些型号的打印机返回的状态码和文档中代码说明不一致请另行作判断,
详细的打印机状态信息请参考打印机状态

总结

以上就是作者要分享的关于lodop通用的几个场景,篇幅有限,更多应用场景和Lodop的功能请参考lodop官网的在线样例.

你可能感兴趣的:(前端)