前端使用C-lodop 实现循环套打小案例
目录
- 前言
- 引入js文件
- 小案例
前言
lodop是一个很优秀打印插件,具体的大家可以官网了解,先在官网下载插件,安装在本地,并启动,点击官网下载
引入js文件
//==本JS是加载Lodop插件或Web打印服务CLodop/Lodop7的综合示例,可直接使用,建议理解后融入自己程序==//用双端口加载主JS文件Lodop.js(或CLodopfuncs.js兼容老版本)以防其中某端口被占:
var MainJS ="CLodopfuncs.js",URL_WS1 = "ws://localhost:8000/"+MainJS, //ws用8000/18000URL_WS2 = "ws://localhost:18000/"+MainJS,URL_HTTP1 = "http://localhost:8000/"+MainJS, //http用8000/18000URL_HTTP2 = "http://localhost:18000/"+MainJS,URL_HTTP3 = "https://localhost.lodop.net:8443/"+MainJS; //https用8000/8443var CreatedOKLodopObject, CLodopIsLocal, LoadJsState;//==判断是否需要CLodop(那些不支持插件的浏览器):==
function needCLodop() {try {var ua = navigator.userAgent;if (ua.match(/Windows\sPhone/i) ||ua.match(/iPhone|iPod|iPad/i) ||ua.match(/Android/i) ||ua.match(/Edge\D?\d+/i))return true;var verTrident = ua.match(/Trident\D?\d+/i);var verIE = ua.match(/MSIE\D?\d+/i);var verOPR = ua.match(/OPR\D?\d+/i);var verFF = ua.match(/Firefox\D?\d+/i);var x64 = ua.match(/x64/i);if ((!verTrident) && (!verIE) && (x64)) return true;else if (verFF) {verFF = verFF[0].match(/\d+/);if ((verFF[0] >= 41) || (x64)) return true;} else if (verOPR) {verOPR = verOPR[0].match(/\d+/);if (verOPR[0] >= 32) return true;} else if ((!verTrident) && (!verIE)) {var verChrome = ua.match(/Chrome\D?\d+/i);if (verChrome) {verChrome = verChrome[0].match(/\d+/);if (verChrome[0] >= 41) return true;}}return false;} catch (err) {return true;}
}//==检查加载成功与否,如没成功则用http(s)再试==
//==低版本CLODOP6.561/Lodop7.043及前)用本方法==
function checkOrTryHttp() {if (window.getCLodop) {LoadJsState = "complete";return true;}if (LoadJsState == "loadingB" || LoadJsState == "complete") return;LoadJsState = "loadingB";var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;var JS1 = document.createElement("script"),JS2 = document.createElement("script"),JS3 = document.createElement("script");JS1.src = URL_HTTP1;JS2.src = URL_HTTP2;JS3.src = URL_HTTP3;JS1.onload = JS2.onload = JS3.onload = JS2.onerror = JS3.onerror=function(){LoadJsState = "complete";}JS1.onerror = function(e) {if (window.location.protocol !== 'https:')head.insertBefore(JS2, head.firstChild); elsehead.insertBefore(JS3, head.firstChild);}head.insertBefore(JS1,head.firstChild);
}//==加载Lodop对象的主过程:==
(function loadCLodop(){if (!needCLodop()) return;CLodopIsLocal = !!((URL_WS1 + URL_WS2).match(/\/\/localho|\/\/127.0.0./i));LoadJsState = "loadingA";if (!window.WebSocket && window.MozWebSocket) window.WebSocket=window.MozWebSocket;//ws方式速度快(小于200ms)且可避免CORS错误,但要求Lodop版本足够新:try {var WSK1=new WebSocket(URL_WS1);WSK1.onopen = function(e) { setTimeout("checkOrTryHttp()",200); }WSK1.onmessage = function(e) {if (!window.getCLodop) eval(e.data);}WSK1.onerror = function(e) {var WSK2=new WebSocket(URL_WS2);WSK2.onopen = function(e) {setTimeout("checkOrTryHttp()",200);}WSK2.onmessage = function(e) {if (!window.getCLodop) eval(e.data);}WSK2.onerror= function(e) {checkOrTryHttp();}}} catch(e){checkOrTryHttp();}
})();//==获取LODOP对象主过程,判断是否安装、需否升级:==
function getLodop(oOBJECT, oEMBED) {var strFontTag = "<br><font color='#FF00FF'>打印控件";var strLodopInstall = strFontTag + "未安装!点击这里<a href='install_lodop32.exe' target='_self'>执行安装</a>";var strLodopUpdate = strFontTag + "需要升级!点击这里<a href='install_lodop32.exe' target='_self'>执行升级</a>";var strLodop64Install = strFontTag + "未安装!点击这里<a href='install_lodop64.exe' target='_self'>执行安装</a>";var strLodop64Update = strFontTag + "需要升级!点击这里<a href='install_lodop64.exe' target='_self'>执行升级</a>";var strCLodopInstallA = "<br><font color='#FF00FF'>Web打印服务CLodop未安装启动,点击这里<a href='CLodop_Setup_for_Win32NT.exe' target='_self'>下载执行安装</a>";var strCLodopInstallB = "<br>(若此前已安装过,可<a href='CLodop.protocol:setup' target='_self'>点这里直接再次启动</a>)";var strCLodopUpdate = "<br><font color='#FF00FF'>Web打印服务CLodop需升级!点击这里<a href='CLodop_Setup_for_Win32NT.exe' target='_self'>执行升级</a>";var strLodop7FontTag = "<br><font color='#FF00FF'>Web打印服务Lodop7";var strLodop7HrefX86 = "点击这里<a href='Lodop7_Linux_X86_64.tar.gz' target='_self'>下载安装</a>(下载后解压,点击lodop文件开始执行)";var strLodop7HrefARM = "点击这里<a href='Lodop7_Linux_ARM64.tar.gz' target='_self'>下载安装</a>(下载后解压,点击lodop文件开始执行)";var strLodop7Install_X86 = strLodop7FontTag + "未安装启动," + strLodop7HrefX86;var strLodop7Install_ARM = strLodop7FontTag + "未安装启动," + strLodop7HrefARM;var strLodop7Update_X86 = strLodop7FontTag + "需升级," + strLodop7HrefX86;var strLodop7Update_ARM = strLodop7FontTag + "需升级," + strLodop7HrefARM;var strInstallOK = ",成功后请刷新本页面或重启浏览器。</font>";var LODOP;try {var isWinIE = (/MSIE/i.test(navigator.userAgent)) || (/Trident/i.test(navigator.userAgent));var isWinIE64 = isWinIE && (/x64/i.test(navigator.userAgent));var isLinuxX86 = (/Linux/i.test(navigator.platform)) && (/x86/i.test(navigator.platform));var isLinuxARM = (/Linux/i.test(navigator.platform)) && (/aarch/i.test(navigator.platform));if (needCLodop() || isLinuxX86 || isLinuxARM) {try {LODOP = window.getCLodop();} catch (err) {}if (!LODOP && LoadJsState !== "complete") {if (!LoadJsState)alert("未曾加载Lodop主JS文件,请先调用loadCLodop过程."); elsealert("网页还没下载完毕,请稍等一下再操作.");return;}var strAlertMessage;if (!LODOP) {if (isLinuxX86)strAlertMessage = strLodop7Install_X86;else if (isLinuxARM)strAlertMessage = strLodop7Install_ARM;elsestrAlertMessage = strCLodopInstallA + (CLodopIsLocal ? strCLodopInstallB : "");document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML;return;} else {if (isLinuxX86 && LODOP.CVERSION < "7.0.4.3")strAlertMessage = strLodop7Update_X86;else if (isLinuxARM && LODOP.CVERSION < "7.0.4.3")strAlertMessage = strLodop7Update_ARM;else if (CLODOP.CVERSION < "6.5.7.7")strAlertMessage = strCLodopUpdate;if (strAlertMessage)document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML;}} else {//==如果页面有Lodop插件就直接使用,否则新建:==if (oOBJECT || oEMBED) {if (isWinIE)LODOP = oOBJECT;elseLODOP = oEMBED;} else if (!CreatedOKLodopObject) {LODOP = document.createElement("object");LODOP.setAttribute("width", 0);LODOP.setAttribute("height", 0);LODOP.setAttribute("style", "position:absolute;left:0px;top:-100px;width:0px;height:0px;");if (isWinIE)LODOP.setAttribute("classid", "clsid:2105C259-1E0C-4534-8141-A753534CB4CA");elseLODOP.setAttribute("type", "application/x-print-lodop");document.documentElement.appendChild(LODOP);CreatedOKLodopObject = LODOP;} elseLODOP = CreatedOKLodopObject;//==Lodop插件未安装时提示下载地址:==if ((!LODOP) || (!LODOP.VERSION)) {document.body.innerHTML = (isWinIE64 ? strLodop64Install : strLodopInstall) + strInstallOK + document.body.innerHTML;return LODOP;}if (LODOP.VERSION < "6.2.2.6") {document.body.innerHTML = (isWinIE64 ? strLodop64Update : strLodopUpdate) + strInstallOK + document.body.innerHTML;}}//===如下空白位置适合调用统一功能(如注册语句、语言选择等):=======================//===============================================================================return LODOP;} catch (err) {alert("getLodop出错:" + err);}
}
小案例
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="LodopFuncs.js"></script>
</head><body><a href="JavaScript:Preview1()">打印预览</a><script>var LODOP; //声明为全局变量 var P_ID = '',loop = 1,c = 0,t = null;async function Preview1() {LODOP = getLodop();const printData = [1, 2];var count = 2, loop = 1;while (count >= 1) {const resp = await singlePrint(printData[count - 1]);if(resp == 'error') {console.log('超时,未响应,中止打印')break;}loop++;count--;}};function AddPrintContent(printData) {LODOP.ADD_PRINT_TEXT(0, 0, 100, 20, "郭德强" + printData);};function singlePrint(printData) {LODOP.PRINT_INIT('测试1');LODOP.SET_PRINT_MODE("CATCH_PRINT_STATUS", true);LODOP.SET_PRINT_PAGESIZE(1, "200mm", "200mm"); // 设置固定纸张大小, 以及设置打印的顺序AddPrintContent(printData);return new Promise((reslove, reject) => {if (LODOP.CVERSION) {console.log('step1')LODOP.On_Return = function (TaskID, Value) {console.log('当前的P_ID', Value) // 0表示不成功 1表示成功// 产生了JOBP_ID = Value;// 如果正常产生了JOB码, 那么解析来就是去监听对应的打印状态if (P_ID && P_ID != '0') {c = 0;waitFor(reslove)}};LODOP.PRINTA();} else {console.log('step2')console.log(LODOP.PRINTA());}})}//获得该JOB是否已经打印成功function waitFor(reslove) {console.log('exe watifor')c = c + 1;console.log(`正在处理${loop}`)console.log(`正等待(JOB代码是"+${P_ID}+")打印结果:"+${c}+"秒`)t = setTimeout(() => waitFor(reslove), 2000);LODOP.On_Return_Remain = true;LODOP.On_Return = function (TaskID, Value) {console.log(`TaskID ${TaskID}, TaskID1 ${TaskID1}, TaskID2 ${TaskID2}, `)if (TaskID == TaskID1) {if (Value == 1) {clearTimeout(t)console.log(`${TaskID1}打印成功`)c = 0;reslove('success');}} else if (TaskID == TaskID2) {if (Value == 0) {clearTimeout(t)c = 0;console.log(`${TaskID2}打印任务被删除!`)reslove('success');};};};TaskID1 = LODOP.GET_VALUE("PRINT_STATUS_OK", P_ID);TaskID2 = LODOP.GET_VALUE("PRINT_STATUS_EXIST", P_ID);if (c > 15) {clearTimeout(t);c = 0;alert("打印超过15秒没捕获到成功状态!");reslove('error')};}</script>
</body></html>
相关文章:
前端使用C-lodop 实现循环套打小案例
目录 前言引入js文件小案例 前言 lodop是一个很优秀打印插件,具体的大家可以官网了解,先在官网下载插件,安装在本地,并启动,点击官网下载 引入js文件 //本JS是加载Lodop插件或Web打印服务CLodop/Lodop7的综合示例&a…...

基于SpringBoot+Vue+mysql卓越导师双选系统设计与实现
博主介绍:✌Csdn特邀作者、博客专家、博客云专家、B站程序阿龙带小白做毕设系列,项目讲解、B站粉丝排行榜前列、专注于Java技术领域和毕业项目实战✌ 系统说明简介: 如今的信息时代,对信息的共享性,信息的流通性有着较…...

Windows 11系统cmd终端美化、Vscode终端美化
win11美化cmd终端和vscode的终端 1. 修改终端背景2. oh-my-posh2.1 安装oh-my-posh2.2 安装Clink2.3 Clink配置oh-my-posh2.4 下载和配置Nerd字体2.5 修改美化主题 3. vscode终端美化 电脑默认的终端没有语法高亮这些,运行命令和代码输出字体一样,有时会…...

[游戏中的图形学实时渲染技术] Part1 实时阴影技术
原理篇: 常见的渲染方程如下: 在不考虑自发光项与考虑阴影对于着色结果的影响之后可以将方程变化为如下形式: 如果射线在到达光源前击中了其他物体时,就认为这条来自光源的光线对着色点没有贡献。 利用上述渲染方程进行正确的着…...

NtripShare Mos地铁自动化监测终端盒子硬件设计
自动化监测产品到目前为止做了接近一年,在软件层面上,控制终端软件、平台软件、网平差算法都已解决,硬件盒子始终是心里过不去的坎,最终还是没有耐住性子自己做了一把。 选型如下: 1、主板:瑞芯微RK3568主板。 2、外…...

第 117 场 LeetCode 双周赛题解
A 给小朋友们分糖果 I 动态规划:设 p [ k ] [ i ] p[k][i] p[k][i] 为将 i i i 个糖果分给 k k k 个小朋友的方案数,先求 p [ 2 ] [ i ] p[2][i] p[2][i] ,再求 p [ 3 ] [ n ] p[3][n] p[3][n] class Solution { public:using ll long …...

OpenCV C++ 图像处理实战 ——《多二维码识别》
OpenCV C++ 图像处理实战 ——《多二维码识别》 一、结果演示二、zxing库配置2.1下载编译三、多二维码识别3.1 Method one3.1.1 源码3.2 Method two3.2.1 源码四、源码测试图像下载总结一、结果演示 </...
经典算法(查找与排序)
查找 顺序查找 顺序查找(Linear Search)是一种在有序数组中查找目标元素的基本算法。它的时间复杂度为 O(n),适用于查找少量数据。顺序查找的基本思想是从数组的第一个元素开始,逐个与待查找的元素进行比较,直到找到…...

微软和Red Hat合体:帮助企业更方便部署容器
早在2015年,微软就已经和Red Hat达成合作共同为企业市场开发基于云端的解决方案。时隔两年双方在企业市场的多个方面开展更紧密的合作,今天两家公司再次宣布帮助企业更方便地部署容器。 双方所开展的合作包括在微软Azure上部署Red Hat OpenShift…...

ZYNQ_project:IP_ram_pll_test
例化MMCM ip核,产生100Mhz,100Mhz并相位偏移180,50Mhz,25Mhz的时钟信号。 例化单口ram,并编写读写控制器,实现32个数据的写入与读出。 模块框图: 代码: module ip_top(input …...

Leetcode刷题详解——优美的排列
1. 题目链接:526. 优美的排列 2. 题目描述: 假设有从 1 到 n 的 n 个整数。用这些整数构造一个数组 perm(下标从 1 开始),只要满足下述条件 之一 ,该数组就是一个 优美的排列 : perm[i] 能够被…...

[PHP]Kodexplorer可道云 v4.47
KodExplorer可道云,原名芒果云,是基于Web技术的私有云和在线文件管理系统,由上海岱牧网络有限公司开发,发布于2012年6月。致力于为用户提供安全可控、可靠易用、高扩展性的私有云解决方案。 用户只需通过简单环境搭建,…...

C/C++数字判断 2021年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
目录 C/C数字判断 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C数字判断 2021年9月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 输入一个字符,如何输入的字符是数字&#x…...

云栖大会丨桑文锋:打造云原生数字化客户经营引擎
近日,2023 云栖大会在杭州举办。今年云栖大会回归了 2015 的主题:「计算,为了无法计算的价值」。神策数据创始人 & CEO 桑文锋受邀出席「生态产品与伙伴赋能」技术主题,并以「打造云原生数字化客户经营引擎」为主题进行演讲。…...

如何用java写一个网站:从零搭建个性化网站
随着互联网的迅猛发展,Java作为一种强大而灵活的编程语言,为构建各类网站提供了丰富的解决方案。本文将探讨如何使用Java编写一个个性化网站,并通过具体实例进行深入分析。 第一步:选择适当的技术栈 在着手构建网站之前࿰…...

Easyui DataGrid combobox联动下拉框内容
发票信息下拉框联动,更具不同的发票类型,显示不同的税率 专票 普票 下拉框选择事件 function onSelectType(rec){//选中值if (rec2){//普通发票对应税率pmsPlanList.pmsInvoiceTaxRatepmsPlanList.pmsInvoiceTaxRateT}else {//专用发票对应税率pmsPlan…...
力扣学习笔记——11. 盛最多水的容器
链接:https://leetcode.cn/problems/container-with-most-water/ 11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的…...
Spring Boot: 约定优于配置的软件设计思想
文章目录 传统Spring框架的繁琐配置1. **管理jar包依赖**2. **维护web.xml**3. **维护Dispatch-Servlet.xml配置项**4. **应用部署到Web容器**5. **第三方组件集成到Spring IOC容器中的配置项维护** Spring Boot的简化与自动化1. Spring Boot Starter启动依赖2. 自动装配机制3.…...

TCP触发海康扫码相机S52CN-IC-JQR-NNN25
PC环境设置 为保证客户端正常运行以及数据传输的稳定性,在使用客户端软件前,需要对 PC 环境 进行设置 关闭防火墙 操作步骤如下: 1. 打开系统防火墙。 2. 在自定义设置界面中,选择关闭防火墙的对应选项,并单击…...

ArcGIS:如何迭代Shp文件所有要素并分别导出为Shp文件?
01 前言 尝试用IDL实现,奈何又涉及新的类IDLffShape,觉得实在没有必要学习的必要,毕竟不是搞开发,只是做做数据处理,没必要拿IDL不擅长的且底层的东西自己造轮子。 这里想到使用Python去解决,gdal太久没用…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...