Lodop-批量逐个打印返回状态

这篇具有很好参考价值的文章主要介绍了Lodop-批量逐个打印返回状态。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

前面写过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,接着判断是否在打印队列中来判断是否打印成功)。

参考:
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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用OFFICE自带控件在EXCEL中批量插入二维码以及条码

    经常在工作中我们需要在电子表格中插入二维码或者条码,在office早期直接下载条码字体就能解决问题,而在以后版本中需要 Microsoft BarCode Control (根据office版本不同有不同的版本)一般office的专业版都带有这个控件,如果没有可以自己下载安装。如果安装完成后可以按照以

    2024年02月06日
    浏览(54)
  • 鸿蒙开发,使用http返回的响应数据无法正常获取 ,利用hilog打印日志一直结果是object或者代码凭空消失,根本没有打印日志(灵异事件???)

    这里简述项目相关背景:前后端分离项目,使用鸿蒙做前端,后端SpringBoot写好接口(通过商品分类id查询商品列表),鸿蒙前端页面使用Tabs组件导航,展示商品分类,点击分类标签,查询后端接口,返回对应分类商品列表数据 项目场景:鸿蒙开发,使用http返回的响应数据无

    2024年04月27日
    浏览(33)
  • vue-plugin-hiprint vue hiprint vue使用hiprint打印控件VUE HiPrint HiPrint简单使用

    因为 vue-plugin-hiprint 使用到了 JQuery 所以需要安装对应依赖 根据自己的系统 安装,静默打印才需要用到 在 main.js 中引入 依赖 我这边的 demo是 打印条形码,其他的也差不多,纸张大小是 宽 18.9 毫米 高 9毫米 打印机纸张大小: 设计面板大小: 如果 打印出来 比较大,可以将

    2023年04月12日
    浏览(24)
  • 可使用Linux 测试IP和端口是否能访问,查看返回状态码

    wget是linux下的下载工具,需要先安装. 用法: wget ip:port 连接存在的端口 telnet是windows标准服务,可以直接用;如果是linux机器,需要安装telnet. 用法: telnet ip port

    2024年02月13日
    浏览(29)
  • Qt中使用QNetworkAccessManager类发送https请求时状态码返回0

    在项目开发中,碰到一个问题,使用QNetworkAccessManager类对象发送https请求时,状态码一直返回0,抓包分析看请求响应也是正常的。费了好大劲终于搞定了,主要是两个原因导致的。 默认是不支持https协议的,需要在代码中手动设置下 如果按照以上方法设置后,状态码还是0,

    2024年02月03日
    浏览(30)
  • C-Lodop 在域名下使用跨域问题

    Access to script at \\\'http://localhost:18000/CLodopfuncs.js?priority=0\\\' from origin \\\'http://xxxxxx\\\' has been blocked by CORS policy: The request client is not a secure context and the resource is in more-private address space `local`. 解决: 浏览器输入 chrome://flags/ 搜索 block-insecure-private-network-requests,修改 Default 为Disabled 重启浏览

    2024年02月07日
    浏览(23)
  • STM32系列(HAL库) ——使用串口打印的3种方式

    1、硬件: STM32C8T6最小系统板 USB-TTL串口模块 ST-Link下载器 2、软件: keil5-IDE cubeMX 1、配置RCC——选择外部时钟源 2、配置SYS—— Serial Wire模式   3、时钟树拉满72M          ......  4、配置串口1      5.创建工程         ...... 1.方式一:使用微库(Use MicroLIB) ①:需要在 u

    2024年01月25日
    浏览(30)
  • 打印Winform控件实现简陋版的分页打印(C#)

    本文的代码可以从这里获取:winformDemo.rar · 张祥裕/分享的资源名称 - Gitee.com 作者的水平有限,如有错误,望指正。 为了简单起见,纸张大小,打印机等信息按照默认的来,本文的实现方案是:打印Panel中的控件信息,循环进行打印,打印完一张,把信息重新填充到对应的控

    2024年02月14日
    浏览(25)
  • Layui中table数据表格使用方法渲染 返回的数据不符合规范,正确的成功状态码应为:“code“: 0异常处理

    返回的数据不符合规范,正确的成功状态码应为:“code”: 0异常处理 根据官方文档描述 异步数据参数中,数据格式解析的回调函数,用于将返回的任意数据格式解析成 table 组件规定的数据格式。table 组件默认规定的数据格式为 很多时候,接口返回的数据格式并不一定都符

    2024年02月16日
    浏览(31)
  • 通过Dynamo批量打印PDF图纸

    最近有小伙伴留言,希望写一篇关于批量打印PDF图纸的教程,于是呢,这次就简单介绍一下批量打印pdf。   首先我在我的Dynamo节点库里简单搜了一下,发现打印pdf的节点挺多的,方式大同小异,我继续选Orchid节点包里的来介绍吧,用着比较习惯。   于是我们定位到Orchid→C

    2024年02月22日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包