vue单据打印 一维码、二维码实现

  1. 编码规则与 JavaScript 代码实现
    编码规则数组:定义了 Code 128 条形码编码规则数组 BARS,其中每个数字对应一种条形码的线条组合模式。
const BARS = [212222,222122,222221,121223,121322,131222,122213,122312,132212,221213,221312,231212,112232,122132,122231,113222,123122,123221,223211,221132,221231,213212,223112,312131,311222,321122,321221,312212,322112,322211,212123,212321,232121,111323,131123,131321,112313,132113,132311,211313,231113,231311,112133,112331,132131,113123,113321,133121,313121,211331,231131,213113,213311,213131,311123,311321,331121,312113,312311,332111,314111,221411,431111,111224,111422,121124,121421,141122,141221,112214,112412,122114,122411,142112,142211,241211,221114,413111,241112,134111,111242,121142,121241,114212,124112,124211,411212,421112,421211,212141,214121,412121,111143,111341,131141,114113,114311,411113,411131,113141,114131,311141,411131,211412,211214,211232,23311120];

起始码与结束码常量:定义了起始码的基础值 START_BASE 和结束码值 STOP。

const START_BASE = 38;
const STOP = 106;

生成条形码 HTML 代码的函数:code128 函数根据输入的条形码内容和类型生成对应的 HTML 代码。如果未指定条形码类型,会自动检测。对于类型为 C 且长度为奇数的条形码内容,会在前面补 0。

function code128(code, barcodeType) {if (arguments.length < 2) {barcodeType = code128Detect(code);}if (barcodeType === 'C' && code.length % 2 === 1) {code = '0' + code;}const bars = parseBarcode(code, barcodeType);return bar2html(bars.join(''));
}

将条形码编码转换为 HTML 元素的函数:bar2html 函数将条形码编码数组转换为 HTML 元素字符串,每个编码对应一个包含线条和间隔样式的

元素。
javascript
function bar2html(s) {
const elements = [];
for (let pos = 0; pos < s.length; pos += 2) {
elements.push( <div class="bar${s.charAt(pos)} space${s.charAt(pos + 1)}"></div>);
}
return elements.join(‘’);
}
检测条形码类型的函数:code128Detect 函数根据输入的条形码内容检测其类型,纯数字为 C 型,包含小写字母为 B 型,其他为 A 型。

function code128Detect(code) {if (/^[0-9]+$/.test(code)) return 'C';if (/[a-z]/.test(code)) return 'B';return 'A';
}

解析条形码字符串的函数:parseBarcode 函数解析条形码字符串,根据条形码类型进行字符编码转换,并计算校验码。最后添加起始码、校验码和结束码到条形码编码数组。
javascript

function parseBarcode(barcode, barcodeType) {const bars = [];let check = 0;// 添加起始码bars.push(BARS[START_BASE + barcodeType.charCodeAt(0)]);for (let i = 0; i < barcode.length; i++) {let code;if (barcodeType === 'C') {code = +barcode.substr(i++, 2);} else {code = barcode.charCodeAt(i);}const converted = fromType[barcodeType](code);if (isNaN(converted) || converted < 0 || converted > 106) {throw new Error(`Unrecognized character (${code}) at position ${i} in code '${barcode}'.`);}check = bars.length === 0? converted : check + converted * bars.length;bars.push(BARS[converted]);}// 添加校验码和结束码bars.push(BARS[check % 103], BARS[STOP]);return bars;
}
字符编码转换函数对象:fromType 对象包含了不同条形码类型的字符编码转换函数。
javascript
const fromType = {A: function(charCode) {if (charCode >= 0 && charCode < 32) return charCode + 64;if (charCode >= 32 && charCode < 96) return charCode - 32;return charCode;},B: function(charCode) {if (charCode >= 32 && charCode < 128) return charCode - 32;return charCode;},C: function(charCode) {return charCode;}
};

将 code128 函数挂载到 window 对象:使 code128 函数在全局可用。

window.code128 = code128;
  1. HTML 与 CSS 样式
    HTML 结构:在 HTML 页面中,使用一个 div 元素(id=“barCodeDiv”)来显示生成的条形码。
    html
<div class="left marginleft"><div class="barcode2" id="barCodeDiv"></div>
</div>

同时,通过一个隐藏的 input 元素(id=“barCodeValue”)获取要生成条形码的内容。
html

CSS 样式:定义了用于显示条形码的样式类,包括线条的宽度和间隔的大小。
css

.barcode2 {float: left;clear: both;overflow: auto;height: 1in;
}
.barcode2 + * {clear: both;
}
.barcode2 div {float: left;height: 0.7in;
}
.barcode2.bar1 {border-left: 2px solid black;
}
.barcode2.bar2 {border-left: 4px solid black;
}
.barcode2.bar3 {border-left: 6px solid black;
}
.barcode2.bar4 {border-left: 8px solid black;
}
.barcode2.space0 {margin-right: 0;
}
.barcode2.space1 {margin-right: 2px;
}
.barcode2.space2 {margin-right: 4px;
}
.barcode2.space3 {margin-right: 6px;
}
.barcode2.space4 {margin-right: 8px;
}
.barcode2 label {clear: both;display: block;text-align: center;font: 0.250in/100% helvetica;
}
  1. 最终渲染
    通过以下 JavaScript 代码获取隐藏 input 元素中的值,并使用 code128 函数生成条形码 HTML 代码,插入到指定的 div 元素中。
const divElement = document.getElementById("barCodeDiv");
const v = document.getElementById("barCodeValue").value;
if (v) {divElement.innerHTML = code128(v, "B");
}

通过以上步骤,在 HTML 页面中实现了 Code 128 一维码的生成与显示。
html 删除其他无关代码,只保留一维码部分

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Code 128 Barcode</title><style type="text/css">.barcode2 {float: left;clear: both;overflow: auto;height: 1in;}.barcode2 + * {clear: both;}.barcode2 div {float: left;height: 0.7in;}.barcode2.bar1 {border-left: 2px solid black;}.barcode2.bar2 {border-left: 4px solid black;}.barcode2.bar3 {border-left: 6px solid black;}.barcode2.bar4 {border-left: 8px solid black;}.barcode2.space0 {margin-right: 0;}.barcode2.space1 {margin-right: 2px;}.barcode2.space2 {margin-right: 4px;}.barcode2.space3 {margin-right: 6px;}.barcode2.space4 {margin-right: 8px;}.barcode2 label {clear: both;display: block;text-align: center;font: 0.250in/100% helvetica;}</style>
</head><body><div class="left marginleft"><div class="barcode2" id="barCodeDiv"></div></div><input id="barCodeValue" type="hidden" value="SCMRMEGA1904128156"><script>(function () {// Code 128 条形码编码规则数组const BARS = [212222, 222122, 222221, 121223, 121322, 131222, 122213, 122312, 132212, 221213, 221312, 231212, 112232, 122132, 122231, 113222, 123122, 123221, 223211, 221132, 221231, 213212, 223112, 312131, 311222, 321122, 321221, 312212, 322112, 322211, 212123, 212321, 232121, 111323, 131123, 131321, 112313, 132113, 132311, 211313, 231113, 231311, 112133, 112331, 132131, 113123, 113321, 133121, 313121, 211331, 231131, 213113, 213311, 213131, 311123, 311321, 331121, 312113, 312311, 332111, 314111, 221411, 431111, 111224, 111422, 121124, 121421, 141122, 141221, 112214, 112412, 122114, 122411, 142112, 142211, 241211, 221114, 413111, 241112, 134111, 111242, 121142, 121241, 114212, 124112, 124211, 411212, 421112, 421211, 212141, 214121, 412121, 111143, 111341, 131141, 114113, 114311, 411113, 411131, 113141, 114131, 311141, 411131, 211412, 211214, 211232, 23311120];const START_BASE = 38;const STOP = 106;// 生成 Code 128 条形码 HTML 代码function code128(code, barcodeType) {if (arguments.length < 2) {barcodeType = code128Detect(code);}if (barcodeType === 'C' && code.length % 2 === 1) {code = '0' + code;}const bars = parseBarcode(code, barcodeType);return bar2html(bars.join(''));}// 将条形码编码转换为 HTML 元素function bar2html(s) {const elements = [];for (let pos = 0; pos < s.length; pos += 2) {elements.push(`<div class="bar${s.charAt(pos)} space${s.charAt(pos + 1)}"></div>`);}return elements.join('');}// 检测条形码类型function code128Detect(code) {if (/^[0 - 9]+$/.test(code)) return 'C';if (/[a - z]/.test(code)) return 'B';return 'A';}// 解析条形码字符串function parseBarcode(barcode, barcodeType) {const bars = [];let check = 0;// 添加起始码bars.push(BARS[START_BASE + barcodeType.charCodeAt(0)]);for (let i = 0; i < barcode.length; i++) {let code;if (barcodeType === 'C') {code = +barcode.substr(i++, 2);} else {code = barcode.charCodeAt(i);}const converted = fromType[barcodeType](code);if (isNaN(converted) || converted < 0 || converted > 106) {throw new Error(`Unrecognized character (${code}) at position ${i} in code '${barcode}'.`);}check = bars.length === 0? converted : check + converted * bars.length;bars.push(BARS[converted]);}// 添加校验码和结束码bars.push(BARS[check % 103], BARS[STOP]);return bars;}// 字符编码转换函数const fromType = {A: function (charCode) {if (charCode >= 0 && charCode < 32) return charCode + 64;if (charCode >= 32 && charCode < 96) return charCode - 32;return charCode;},B: function (charCode) {if (charCode >= 32 && charCode < 128) return charCode - 32;return charCode;},C: function (charCode) {return charCode;}};// 将 code128 函数挂载到 window 对象上window.code128 = code128;})();const divElement = document.getElementById("barCodeDiv");const v = document.getElementById("barCodeValue").value;if (v) {divElement.innerHTML = code128(v, "B");}</script>
</body></html>

vue打印代码

 let newOpen = window.open()newOpen.document.write(this.html)setTimeout(() => {newOpen.window.print()// 如果直接关窗口,弹警告if (newOpen.closed) {// 请勿直接关闭打印窗口alert(this.$t('MSG040005'))return}// 打印或取消,自动关闭新窗口newOpen.close()}, 100)
 document.body.innerHTML = this.htmlconsole.log(this.html)window.print()setTimeout(() => {window.location.reload()}, 100)

区别总结
窗口操作:第一段代码打开一个新的窗口进行打印,不会影响当前页面;第二段代码直接在当前页面进行打印,并在打印完成后重新加载页面。
页面内容处理:第一段代码将内容写入新窗口,不改变当前页面的内容;第二段代码直接替换当前页面的 body 内容。
用户体验:第一段代码提供了一个独立的打印窗口,用户可以在不影响当前页面的情况下进行打印操作;第二段代码会临时改变当前页面的内容,可能会给用户带来一些干扰。
综上所述,选择使用哪段代码取决于具体的需求和场景。如果需要独立的打印环境,避免影响当前页面,建议使用第一段代码;如果需要临时修改当前页面内容进行打印,并且希望打印完成后恢复页面状态,可以使用第二段代码。
如下是二维码的生成代码

<input id="barCodeValue" value="110000918" type="hidden" th:value="${runcardId}"/>
<script>// 生成第二个二维码var qrcodeDiv2 = document.getElementById("barCodeDiv");var v1 = document.getElementById("barCodeValue").value;if (v1!== '') {var qr = new QRCode(qrcodeDiv2, {text: v1,width: 130, // 设置二维码的宽度,可根据需要调整height: 130, // 设置二维码的高度,可根据需要调整});}
</script>
 <div class="barcode"style="height:150px;width: 150px" id="barCodeDiv"></div>
 #barCodeDiv {position: absolute;top: 0;right: 0;}.barcode {float: left;clear: both;padding: 0; /*quiet zone*/overflow: auto;/*height:0.5in;!*size*!*/}.barcode {float:left;clear:both;padding: 0; /*quiet zone*/overflow:auto;/*height:0.5in; !*size*!*/}.right { float:right; }.barcode + * { clear:both; }.barcode div {float:left;height: 0.35in; /*size*/}.barcode .bar1 { border-left:1px solid black; }.barcode .bar2 { border-left:2px solid black; }.barcode .bar3 { border-left:3px solid black; }.barcode .bar4 { border-left:4px solid black; }.barcode .space0 { margin-right:0 }.barcode .space1 { margin-right:1px }.barcode .space2 { margin-right:2px }.barcode .space3 { margin-right:3px }.barcode .space4 { margin-right:4px }.barcode label {clear:both;display:block;text-align:center;font: 0.125in/100% helvetica; /*size*/}
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js"></script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22793.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea从远程gitee拉取项目

文章目录 从gitee上面拿到项目地址填写远程地址,并且设置项目保存位置拉取成功 从gitee上面拿到项目地址 填写远程地址,并且设置项目保存位置 拉取成功

大数据学习之PB级音乐数据中心数仓综合项目(1)-理论知识和项目需求、歌曲热度与歌手热度排行

一、理论知识和项目需求 1.课程介绍 2.数据库与ER建模_数据库三范式 3.数据库与ER建模_ER实体关系模型 4.数据库与维度建模_数据仓库(DATA WAREHOUSE) 5.数据库与维度建模_数据库与数据仓库区别 6.数据库与维度建模_数据仓库的发展历程 7.数据库与维度建模_维度建模 8.数据库与…

数据结构之队列

1. 队列的概念及结构 1.1 队列的概念 队列&#xff1a;只允许在一段进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操…

计算机网络-面试总结

计算机网络 从输入一个URL到页面加载完成的过程 整体流程 DNS查询过程SSL四次握手HTTP 的长连接与短连接 HTTP 的 GET 和 POST 区别浏览器访问资源没有响应&#xff0c;怎么排查? OSI七层参考模型 TCP/IP四层参考模型比较 TCP/IP 参考模型与 OSI 参考模型 TCP三次握手&四…

kafka消费能力压测:使用官方工具

背景 在之前的业务场景中&#xff0c;我们发现Kafka的实际消费能力远低于预期。尽管我们使用了kafka-go组件并进行了相关测试&#xff0c;测试情况见《kafka-go:性能测试》这篇文章。但并未能准确找出消费能力低下的原因。 我们曾怀疑这可能是由我的电脑网络带宽问题或Kafka部…

正式页面开发-登录注册页面

整体路由设计&#xff1a; 登录和注册的切换是切换组件或者是切换内容&#xff08;v-if和 v-else)&#xff0c;因为点击两个之间路径是没有变化的。也就是登录和注册共用同一个路由。登录是独立的一级路由。登录之后进到首页&#xff0c;有三个大模块&#xff1a;文章分类&…

Oracle 深入理解Lock和Latch ,解析访问数据块全流程

Oracle 锁机制介绍 根据保护对象的不同&#xff0c;单实例Oracle数据库锁可以分为以下几大类&#xff1a; DML lock&#xff08;data locks&#xff0c;数据锁&#xff09;&#xff1a;用于保护数据的完整性&#xff1b; DDL lock&#xff08;dictionary locks&#xff0c;字典…

Codes 开源免费研发项目管理平台 2025年第一个大版本3.0.0 版本发布及创新的轻IPD实现

Codes 简介 Codes 是国内首款重新定义 SaaS 模式的开源项目管理平台&#xff0c;支持云端认证、本地部署、全部功能开放&#xff0c;并且对 30 人以下团队免费。它通过创新的方式简化研发协同工作&#xff0c;使敏捷开发更易于实施。并提供低成本的敏捷开发解决方案&#xff0…

aws(学习笔记第二十九课) aws cloudfront hands on

aws(学习笔记第二十九课) 使用aws cloudfront 学习内容&#xff1a; 什么是aws cloudfront练习使用aws cloudfront 1. 什么是aws cloudfront aws cloudfront的整体架构 这里可以看出&#xff0c;aws引入了edge location的概念&#xff0c;用户的client与edge location进行是…

写大论文的word版本格式整理,实现自动生成目录、参考文献序号、公式序号、图表序号

前情提要&#xff1a;最近开始写大论文&#xff0c;发现由于内容很多导致用老方法一个一个改的话超级麻烦&#xff0c;需要批量自动化处理&#xff0c;尤其是序号&#xff0c;在不断有增添删减的情况时序号手动调整很慢也容易出错&#xff0c;所以搞一个格式总结&#xff0c;记…

AWS - Redshift - 外部表读取 Parquet 文件中 timestamp 类型的数据

问题&#xff1a; 通过 Redshift Spectrum 功能可以读取 S3 中的文件&#xff0c;当读取 Parquet 文件时&#xff0c;如果列格式设置为 timestamp&#xff0c; 通过 psql 客户端读取会出现以下错误&#xff1a; testdb# select * from myspectrum_schema_0219.test_ns; ERROR…

单片机总结【GPIO/TIM/IIC/SPI/UART】

一、GPIO 1、概念 通用输入输出口&#xff1b;开发者可以根据自己的需求将其配置为输入或输出模式&#xff0c;以实现与外部设备进行数据交互、控制外部设备等功能。简单来说&#xff0c;GPIO 就像是计算机或微控制器与外部世界沟通的 “桥梁”。 2、工作模式 工作模式性质特…

25工程管理研究生复试面试问题汇总 工程管理专业知识问题很全! 工程管理复试全流程攻略 工程管理考研复试真题汇总

工程管理复试面试心里没底&#xff1f;别慌&#xff01;学姐手把手教你怎么应对复试&#xff01; 很多同学面对复试总担心踩坑&#xff0c;其实只要避开雷区掌握核心技巧&#xff0c;逆袭上岸完全有可能&#xff01;这份保姆级指南帮你快速锁定重点&#xff0c;时间紧迫优先背…

具有整合各亚专科医学领域知识能力的AI智能体开发纲要(2025版)

整合各亚专科医学领域知识能力的AI代理的开发与研究 一、引言 1.1 研究背景 在科技飞速发展的当下,人工智能(AI)已成为推动各行业变革的关键力量,医疗领域也不例外。近年来,AI 在医疗行业的应用取得了显著进展,从医学影像诊断到疾病预测,从药物研发到个性化医疗,AI 技…

halcon 条形码、二维码识别、opencv识别

一、条形码 函数介绍 create_bar_code_model * 1.创建条码读取器的模板 * 参数一&#xff1a;通用参数的名称&#xff0c;针对条形码模型进行调整。默认值为空 * 参数二&#xff1a;针对条形码模型进行调整 * 参数三&#xff1a;条形码模型的句柄。 create_bar_code_model (…

企业级RAG开源项目分享:Quivr、MaxKB、Dify、FastGPT、RagFlow

企业级 RAG GitHub 开源项目深度分享&#xff1a;Quivr、MaxKB、Dify、FastGPT、RagFlow 及私有化 LLM 部署建议 随着生成式 AI 技术的成熟&#xff0c;检索增强生成&#xff08;RAG&#xff09;已成为企业构建智能应用的关键技术。RAG 技术能够有效地将大型语言模型&#xff…

游戏引擎学习第118天

仓库:https://gitee.com/mrxiao_com/2d_game_3 优化工作概述 这次我们正在进行一些非常有趣的工作&#xff0c;主要是对游戏进行优化。这是首次进行优化&#xff0c;我们正在将一个常规的标量C代码例程转换为内建指令&#xff0c;以便利用AIX 64位处理器的SIMD指令集进行加速…

pycharm中配置PyQt6详细教程

PyQt6 是 Qt 框架的 Python 绑定库,基于 Qt 6 开发,专为创建跨平台图形用户界面(GUI)应用程序设计。 本章教程,主要记录在pycharm中配置使用PyQt6的流程。 一、安装基础环境 在此之前,你需要提前安装好Python解释器,推荐使用anaconda创建虚拟环境。 conda create -n pyt…

Spring AOP

1.AOP概述 什么是AOP? Spring 俩大核心: Spring IoC 和 Spring AOP IoC 控制反转(把Bean的控制权交给Spring来进行管理) AOP(Aspect Oriented Programming)面向切面编程.它和面向对象编程不是互斥关系,而是面向对象编程的补充. 什么是⾯向切⾯编程呢? 切⾯就是指某⼀类特定问…

【多模态处理篇二】【深度揭秘:DeepSeek视频理解之时空注意力机制解析】

一、为啥要搞视频理解这事儿 咱先唠唠为啥视频理解这么重要哈。现在这互联网时代,视频那可是铺天盖地的。你刷短视频平台,看在线电影,玩游戏直播,到处都是视频。但是计算机它一开始可不懂视频里到底是啥意思,它看到的就是一堆像素点和声音信号。 视频理解呢,就是要让计…