前面已經說過,如何簡單使用lodop了,今天說一下如何獲得lodop的打印狀態?
在教程里面找了半天,摸索出來了一套。
template:
<!-- 實驗代碼 --> <div>job碼</div> <input type="text" v-model="jobCode"> <div id="printarea" v-html="bb" v-show="false"></div> <el-button @click="print()">打印</el-button> <el-button @click="preview()">預覽</el-button>
data:
bb:`<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <style> </style> <body> <div style="text-align:center;font-family:'楷體';"> <div style="font-size:24px;font-weight:600;">交通會</div> <div style="font-size:24px;font-weight:500;margin-top:70px;">大薩達所大所大薩達所大所所大薩達所大所</div> </div> </body> </html>`, jobCode:'1',//job碼 printStatus:0,//打印狀態
methods:
createPrintCode(){ LODOP = getLodop(); // 打印初始化 LODOP.PRINT_INIT("打印任務名稱"); // 設置字體 LODOP.SET_PRINT_STYLE("FontSize",18); // 設置加粗 LODOP.SET_PRINT_STYLE("Bold",1); // 設置紙張大小 打印方向/width/height LODOP.SET_PRINT_PAGESIZE(0,"100mm","100mm","商品標簽"); //在指定位置加文本 // LODOP.ADD_PRINT_TEXT(50,"20%",260,39,"打印頁面部分內容"); // 增加超文本項top/left/width/height(高度自適應,設小了有效,大了無效) LODOP.ADD_PRINT_HTM("20mm","10mm","80mm","600mm",document.getElementById("printarea").innerHTML); }, print(){//打印 var self=this; this.createPrintCode(); LODOP.SET_PRINT_MODE("CATCH_PRINT_STATUS",true);//執行該語句之后,PRINT指令不再返回那個所謂“打印成功” if (LODOP.CVERSION) {//判斷c_lodop是否存在,安裝了c-lodop就會存在 LODOP.On_Return=function(TaskID,Value){ console.log("TaskID:"+TaskID); console.log("Value:"+Value);//job代碼 self.jobCode=Value; var timer = setInterval(function(){ console.log("每次輪詢的狀態:"+self.printStatus); if(self.printStatus!=0||self.printStatus!=false){ clearInterval(timer); return; } self.getStatusValue(Value); },300); }; LODOP.PRINT(); return; } else{ console.log("c-lodop出錯了"); } }, getStatusValue(job){//根據job代碼,獲取是否打印成功 var self=this; LODOP.On_Return=function(TaskID,Value){ console.log("TaskID:"+TaskID); console.log("打印成功狀態:"+Value);//打印成功狀態 self.printStatus=Value; }; LODOP.GET_VALUE("PRINT_STATUS_OK",job); }, preview(){//預覽 this.createPrintCode(); // 預覽 LODOP.PREVIEW(); // 直接打印 // LODOP.PRINT(); },
下面來簡單說一下,lodop插件可以實現靜默打印,免費的時候,靜默打印會帶水印。
調起靜默打印很簡單,但是如何知道打印機打印成功呢?
看了看,lodop的例子,我們可以獲得打印狀態,如果想更智能點,需要去循環查詢此狀態,一旦返回成功的狀態,我們就可以進行下一步處理了!!
第一次調用: LODOP.On_Return=function(TaskID,Value){},就是給lodop加了個回調函數,TaskID:代表任務id,value是job代碼,我也不大理解job代碼,不過用它可以去查詢,打印狀態!!
那么,這個job代碼在哪用呢?
看上面代碼可以知道,在getStatusValue(job)方法中用到了它,這個方法里又一次給lodop加了個回調函數,參數和第一次調用名字完全一樣,但是加完這個回調函數后,下面還寫了一句代碼:
LODOP.GET_VALUE("PRINT_STATUS_OK",job);
這句代碼是 根據job代碼 查詢打印狀態的,調用完這句后,就會觸發那個回調函數了,嗯此時的回調內 反回來的value值,就是打印的狀態(成功:1或true 失敗:0或false),這個值可以用一個全局變量接住,當我們點擊打印時,就循環查詢這個狀態,一旦,返回的狀態時成功狀態,那么終止循環查詢。
具體可以參考,教程的45講
判斷本地c-lodop服務是否啟動,可以在
LODOP = getLodop();后加一個判斷
如果c-lodop服務沒啟動,這個值就會是undefined
如果啟動了,會有值!!!
判斷打印機是否忙碌:“PRINT_STATUS_BUSY”
getStatusValue(valueName,job){//根據job代碼,獲取是否打印成功 var self=this; LODOP.On_Return=function(TaskID,Value){ console.log("TaskID:"+TaskID); console.log(valueName+":"+Value); self.printStatus=Value; }; LODOP.GET_VALUE(“PRINT_STATUS_BUSY”,job); },
下面,再上一個完整的demo,在vue中使用:
<template> <div class="dashboard-container"> <!-- 實驗代碼 --> <div>job碼</div> <div id="printarea" v-html="bb" v-show="false"></div> <el-button @click="print(1,bb)" :disabled="Boolean(printStatus)">打印</el-button> <el-button @click="preview()">預覽</el-button> <el-button @click="print(count,bb)" :disabled="Boolean(printStatus)">重復打印</el-button> <input type="text" v-model.number="count"> <!-- <el-button @click="reqeatPrint()">分任務連續打印</el-button> --> <el-button @click="breakPagetPrint(printList)">分頁連續打印</el-button> <!-- 遮罩層 --> <div class="dayinShadow" v-show="shadowShow"> <i class="el-icon-close" @click="closeShadow()" style="cursor:pointer;float:right;font-size:30px;margin:30px;"></i> 正在打印中... </div> <!-- 實驗代碼 --> </div> </template> <script> var LODOP; export default {// 實驗代碼 watch:{ }, data(){ return { // 實驗代碼 bb:`<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <style> </style> <body> <div style="text-align:center;font-family:'微軟雅黑';"> <div style="font-size:24px;font-weight:600;">xx</div> <div style="font-size:20px;font-weight:500;margin-top:50px;">xx市</div> <!-- <img src="http://cmsppt.hoohui.cn/qrCode/1564626553.png" /> --> </div> </body> </html>`, cc:`<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <style> </style> <body> <div style="text-align:center;font-family:'微軟雅黑';"> <div style="font-size:24px;font-weight:600;">xx</div> <div style="font-size:20px;font-weight:500;margin-top:50px;">xx市</div> </div> </body> </html>`, printList:[],//打印數組 printStatus:0,//打印狀態 shadowShow:false,//遮罩顯示與否 count:1,//打印份數 // 實驗代碼 } }, created(){ this.printList.push(this.bb); this.printList.push(this.cc); console.log(this.printList) }, mounted(){ }, methods:{ createPrintCode(count,htmlStr){ var self=this; LODOP = getLodop(); return new Promise(function(resolve,reject){ if (LODOP.CVERSION) {//是否能檢測到c-lodop的版本號 if(!LODOP){//c-lodop如果沒啟動,則不能打印 alert("請啟動c-lodop服務"); return; } // 打印初始化 LODOP.PRINT_INIT("打印任務名稱"); if(count){//設置重復打印要放在初始化后面 LODOP.SET_PRINT_COPIES(count); } // 設置紙張大小 打印方向/width/height LODOP.SET_PRINT_PAGESIZE(0,"100mm","100mm","商品標簽"); // 增加超文本項top/left/width/height(高度自適應,設小了有效,大了無效) LODOP.ADD_PRINT_HTM("40mm","10mm","80mm","600mm",htmlStr); resolve(); } else{ alert("請下載c-lodop"); } }) }, breakPagetPrint(htmlList=[]){//分頁連續打印 var self=this; if(htmlList.length==0){return}; self.shadowShow=true; LODOP = getLodop(); if (LODOP.CVERSION) {//是否能檢測到c-lodop的版本號 if(!LODOP){//c-lodop如果沒啟動,則不能打印 alert("請啟動c-lodop服務"); return; } LODOP.PRINT_INIT("分頁打印任務");//初始化在循環中 // 設置紙張大小 打印方向/width/height LODOP.SET_PRINT_PAGESIZE(0,"100mm","100mm","商品標簽"); // 增加超文本項top/left/width/height(高度自適應,設小了有效,大了無效) for(let i=0,len=htmlList.length;i<len;i++){ LODOP.ADD_PRINT_HTM("40mm","10mm","80mm","600mm",htmlList[i]); LODOP.NewPage(); } self.carryPrint();//執行打印命令 } else{ alert("請下載c-lodop"); } }, print(count,htmlStr){//打印 var self=this; if(!htmlStr){alert("沒有要打印的內容"); return;}; self.shadowShow=true; this.createPrintCode(count,htmlStr).then(function(){ self.carryPrint(); }) }, carryPrint(){//執行打印命令 var self=this; LODOP.SET_PRINT_MODE("CATCH_PRINT_STATUS",true);//執行該語句之后,PRINT指令不再返回那個所謂“打印成功”,才能獲取到打印狀態 LODOP.On_Return=function(TaskID,Value){//TaskID:任務id,Value:job代碼 var timer = setInterval(function(){ if(self.printStatus!=0 || self.printStatus!=false){ clearInterval(timer); self.printStatus=0; self.shadowShow=false; return; } // PRINT_STATUS_BUSY self.getStatusValue("PRINT_STATUS_OK",Value);//查詢打印任務完成狀態 },500); }; LODOP.PRINT(); }, getStatusValue(valueName,job){//根據job代碼,獲取是否打印成功 var self=this; LODOP.On_Return=function(TaskID,Value){//TaskID:任務id,Value:打印成功狀態 //彈出層彈出時,而打印機沒正常打印,此時為了能關閉彈窗,需要強行把打印狀態改成1(完成狀態) self.printStatus = self.shadowShow ? Value : 1; console.log("打印成功狀態:"+self.printStatus); }; LODOP.GET_VALUE(valueName,job); }, preview(){//預覽 this.createPrintCode().then(function(){ LODOP.PREVIEW(); }) }, closeShadow(){//強制關閉遮罩層 this.printStatus=1;//強制打印狀態變為1 this.shadowShow=false;//強制遮罩成關閉 }, reqeatPrint(){//分任務連續打印 var self=this; LODOP = getLodop(); for(let i=0,len=self.printList.length;i<len;i++){ LODOP.PRINT_INIT("循環打印任務");//初始化在循環中 // 設置字體 LODOP.SET_PRINT_STYLE("FontSize",18); // 設置加粗 LODOP.SET_PRINT_STYLE("Bold",1); // 設置紙張大小 打印方向/width/height LODOP.SET_PRINT_PAGESIZE(0,"100mm","100mm","商品標簽"); // 增加超文本項top/left/width/height(高度自適應,設小了有效,大了無效) LODOP.ADD_PRINT_HTM("40mm","10mm","80mm","600mm",self.printList[i]); LODOP.PRINT(); } }, } } </script> <style lang="scss" scoped> .dashboard { .dayinShadow{ position: fixed; top:0; left:0; right:0; bottom:0; background:rgba(0,0,0,.5); z-index: 1200; color:#ffffff; font-size:20px; text-align:center; line-height:800px; } </style>