前言
前面写过Lodop的相关文章 :
文章一:《Lodop打印控件常用指令记录》
文章二:《Vue3+hooks快速接入Lodop打印插件》
今天版本迭代,之前打印状态判断依据是否推送到打印队列来判断是否成功,这次要优化下
一、LODOP.GET_VALUE(‘PRINT_STATUS_OK’, P_ID)
LODOP.GET_VALUE(‘PRINT_STATUS_OK’, P_ID),判断打印是否成功。
这个状态不是所有打印机能支持这种判断成功,这个是通过“状态码包含128”来 判断,但是但有些打印机输出完毕状态码不变成128,而一直等于20(“正在打印16”和“正在删除4”之和),所有这种单独用这个PRINT_STATUS_OK判断,有些打印机会判断不出来。
这种情况下,需要加附加判断,判断打印机不在队列为成功。也就是下面LODOP.GET_VALUE(‘PRINT_STATUS_EXIST’, P_ID)
二、LODOP.GET_VALUE(‘PRINT_STATUS_EXIST’, P_ID)
这种方法如果是手动在队列删除了任务,也会判断为成功。
但是大多数情况下,一般用户不会在打印中途删除任务,所以这种方法还可以使用,但是这种是根据JOB判断
目前市面上很多软件,大多没有提示打印成功的,打印机本身如果缺纸卡纸或脱机等,打印机本身会有提示音或提示灯,windows系统一般会在右下角提示打印错误(目前lodop 也不支持mac os系统),所以不提示成功也是常见的。但是我这里打印后要标记是否成功,传回后端,比较严格控制打印数量。而直接简单判断是否推送到打印队列,会标记打印成功,但打印纸张没有出来的情况,改为是否在队列来判断的话,可以判断打印脱机的情况,还没有出纸
三、核心实现代码
参考官网 Lodop案例45 实现。
我这边是强制使用C-Lodop,参考7.Lodop控件升级到C-Lodop云打印 ,配置相关代码实现。所以下面的代码就不需要考虑Lodop.CVERSION 之类的判断和Lodop 插件的兼容。VIP群友说只用C-Lodop 有时候纸张尺寸切换获取会延迟,我目前没用到。这里提一嘴。
let
LODOP,
P_ID = '',
TaskID1,
TaskID2,
t,
c = 0 //声明为全局变量
function PrintWait() {
return new Promise(async (resolve, reject) => {
if (c > 0) {
console.log('正打印中...')
return
}
// 执行该语句之后,PRINT指令不再返回那个所谓“打印成功”,才能获取到打印状态
LODOP.SET_PRINT_MODE('CATCH_PRINT_STATUS', true)
LODOP.On_Return = async function (TaskID, Value) {
P_ID = Value
console.log('该任务走的是c-lodop方式,job代码为' + P_ID)
if (P_ID != '') {
c = 0
const isSucces = await C_WaitFor()
resolve(isSucces)
}
}
LODOP.PRINT()
})
}
function C_WaitFor() {
return new Promise((resolve, reject) => {
let t;
function checkStatus() {
c = c + 1;
console.log('正等待(JOB代码是' + P_ID + ')打印结果:' + c + '秒');
if (c > 20) {
clearTimeout(t);
console.log('打印超过20秒没捕获到成功状态!');
c = 0;
ElMessage.warning('Printing is interrupted, please check the printer connection. ');
resolve(false);
return;
}
// const TaskID1 = LODOP.GET_VALUE('PRINT_STATUS_OK', P_ID);
const TaskID2 = LODOP.GET_VALUE('PRINT_STATUS_EXIST', P_ID);
LODOP.On_Return_Remain = true;
LODOP.On_Return = function(TaskID, Value) {
if (TaskID == TaskID1 && Value == 1) {
clearTimeout(t);
console.log(`走的c-lodop方式:PRINT_STATUS_OK判断为打印成功,TaskID:${TaskID},value:${Value}`);
c = 0;
resolve(true);
} else if (TaskID == TaskID2 && Value == 0) {
clearTimeout(t);
console.log(`走的c-lodop方式:判断该该任务已经不在队列,已成功或删除任务,TaskID:${TaskID},value:${Value}`);
c = 0;
resolve(true);
}
};
t = setTimeout(checkStatus, 1000);
}
checkStatus();
});
}
// 旧代码,在 LODOP.On_Return 函数中使用了异步操作,而 setTimeout 是在每次递归调用 C_WaitFor 时触发的。这可能导致异步操作和递归调用之间的竞争条件,从而导致结果无法正确解决。
//为了解决这个问题,我们可以对代码进行一些重构,将异步操作的逻辑与递归调用分离开来。
// 我们可以使用一个辅助函数来处理异步操作,并在操作完成后再进行递归调用。
function C_WaitFor_已废弃() {
return new Promise(async (resolve, reject) => {
c = c + 1
console.log('正等待(JOB代码是' + P_ID + ')打印结果:' + c + '秒')
t = setTimeout(C_WaitFor, 1000)
// 加了这句On_Return 保持多个回调结果
LODOP.On_Return_Remain = true
LODOP.On_Return = function (TaskID, Value) {
if (TaskID == TaskID1) {
if (Value == 1) {
clearTimeout(t)
console.log(
`走的c-lodop方式:PRINT_STATUS_OK判断为打印成功,TaskID:${TaskID},value:${Value}`
)
c = 0
return resolve(true)
}
} else if (TaskID == TaskID2) {
if (Value == 0) {
clearTimeout(t)
console.log(
`走的c-lodop方式:判断该该任务已经不在队列,已成功或删除任务,TaskID:${TaskID},value:${Value}`
)
c = 0
return resolve(true)
}
}
}
// TaskID1 = LODOP.GET_VALUE('PRINT_STATUS_OK', P_ID)
TaskID2 = LODOP.GET_VALUE('PRINT_STATUS_EXIST', P_ID)
if (c > 20) {
clearTimeout(t)
console.log('打印超过20秒没捕获到成功状态!')
c = 0
ElMessage.warning('Printing is interrupted, please check the printer connection. ')
return resolve(false)
}
})
}
在打印 printA4Paper() 函数内判断逻辑加上面代码。而且用 return new Promise(async (resolve, reject) => {}) 保证里面 LODOP.On_Return回调之后执行。这样就只会一个一个job推送到打印队列。其中有一个失败就中断。
Tips:
printA4Paper() 在往期文章:《Vue3+hooks快速接入Lodop打印插件》 有提到。
更新:上面C_WaitFor() 旧代码,当等待多次后 无法返回结果。原因是上一个promise 没有正确resolve,一直处在pendding 中
总结
以上就是今天的内容了。主要介绍了使用Lodop 打印插件,在循环打印的时候实现串行打印,并且获取打印结果(首先获取job,接着判断是否在打印队列中来判断是否打印成功)。文章来源:https://www.toymoban.com/news/detail-805913.html
参考:
http://www.c-lodop.com/demolist/PrintSample45.html,
http://www.c-lodop.com/demolist/PrintSample45.html,
https://www.cnblogs.com/huaxie/p/11730651.html文章来源地址https://www.toymoban.com/news/detail-805913.html
到了这里,关于Lodop-批量逐个打印返回状态的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!