VUE中:printJS使用,附带JsBarcode条码生成器,网页转图片html2canvas,base64上传保存处理,二维码生成库qrcode,二维码/条码扫描识别,domtoimage

article/2025/9/18 21:25:59

官网
JsBarcode官网
JsBarcode的GitHub-WIKI
我的项目需求只需要将配置好的HTML与CSS样式传入进去就好,较为简单。

九个月后html2canvas出现线上问题 设置了跨域但依然出现跨域问题,尝试解决失败,换用domtoimage

安装: npm install print-js --save
使用: import print from 'print-js'

printJS函数封装:

print (ref, title, style, type, jsonData, borderHeadStyle, gridStyle, css) {printJS({printable: ref,// 要打印内容的idtype: type || 'html', // 可以打印html,img详细的可以在官方文档style: style || '@page{size:auto;margin: 0cm 1cm 0cm 1cm;}', // 打印的内容是没有css样式的,此处需要string类型的css样式header: title || null,https://printjs.crabbly.com/中查询headerStyle: 'font-size:6px;font-weight:600;text-align:center;padding:15px 0 10px 0;', // 标题设置properties: jsonData || [], // json数据元gridHeaderStyle: borderHeadStyle || 'font-size:6px;font-weight:400;height:40px;line-height:40px;border: 1px solid #ccc;padding:3px 5px 3px 5px;text-align:center;', // json格式表头样式gridStyle: gridStyle || 'font-size:1px;font-weight:200;border: 1px solid #ccc;padding:3px 5px 3px 5px;text-align:center;', // json各式表哥央视scanStyles: false, // 不适用默认样式repeatTableHeader: false, // 打印json表头只显示在第一页css: css || null // css url});},

但在实际开发过程中遇到了:直接传入DOM节点 CSS样式全部失效的问题,由于显示内容多,自己手写JS会非常麻烦。故引入第二个库,网页转图片:
安装:npm install --save html2canvas
使用:import html2canvas from 'html2canvas';
使用代码:

html2canvas(this.$refs.printContent).then(canvas => {let dataURL = canvas.toDataURL('image/png');this.imgUrl = dataURL;printJS({printable: dataURL,type: 'image'});});

若打印的图片不清晰请戳这里
或这里
🔺🔺html2canvas只适用于页面截图,若是需要将元素隐藏再父元素中点击按钮打印而不是跳转新页面的话,隐藏元素会导致不能转换图片
🔺🔺且不支持部分CSS样式(例如float浮动样式)。当元素内容打印不出来时注意在这里插入图片描述也可以选择生成二维码而不是条码:qrcode下载源:参考案例在项目文件夹内执行:npm install --save qrcode全局安装:npm install -g qrcode在需要的页面引入 import QRcode from "qrcode";使用:

//canvas是HTML的绘图标签,省略返回新绘图
//sample text:输入你需要转换为二维码的字符串,可以是网址链接
//function在执行完成时的回调函数
QRCode.toCanvas(canvas, 'sample text', function (error) {if (error) console.error(error)console.log('success!');
})

开发代码实例:

async createImg(){await this.$nextTick();// this.$nextTick()将回调延迟到下次 DOM 更新循环之后执行this.imgUrl = await this.makeImg();printJS({printable: this.imgUrl,type: 'image'});console.log(this.imgUrl);},makeImg(){return new Promise(resolve=>{html2canvas(this.$refs.tab1, {scale: 2,dpi: 2000,height: this.$refs.tab1.clientHeight + 5, // dom 原始宽度width: this.$refs.tab1.clientWidth + 5, // dom 原始宽度scrollY: 0, // 偏移值scrollX: 0,useCORS: true// 跨域}).then(canvas => {let dataURL = canvas.toDataURL('image/png');resolve(dataURL);}).catch(err => {console.log(err);});})},

开发代码实例2:(获取UeEditor富文本编辑器-即iframe标签,中的内容并保存为图片,且将base64转为file对象并fromData后保存)

        //找到DOM创建图片async createImg(whichOne){return new Promise(resolve=>{let view = document.getElementById(whichOne);let iframe = view.children[0].children[0].getElementsByClassName('edui-editor-iframeholder edui-default')[0].children[0].contentWindow.document;// await this.$nextTick();// this.$nextTick()将回调延迟到下次 DOM 更新循环之后执行resolve(this.makeImg(iframe.getElementsByClassName('view')[0].children[1].children[0]))  })},//html2canvas生成图片makeImg(printContent){return new Promise(resolve=>{html2canvas(printContent, {scale: 2,dpi: 2000,height: printContent.clientHeight + 5, // dom 原始宽度width: printContent.clientWidth + 5, // dom 原始宽度scrollY: 0, // 偏移值scrollX: 0,useCORS: true// 跨域}).then(canvas => {let dataURL = canvas.toDataURL('image/png');console.log(dataURL);resolve(dataURL);}).catch(err => {console.log(err);});})},       //将生成的图片转为可上传服务器的fromdata对象async base64ImgtoFile(data) {return new Promise(resolve=>{//新建formData对象var form=document.forms[0];  var formData = new FormData(form);//将base64图片数据转二进制后保存为file对象let filename = this.revtimeToString(new Date)+'.png'var arr = data.split(','), mime = arr[0].match(/:(.*?);/)[1],bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);while(n--){u8arr[n] = bstr.charCodeAt(n);}let file = new File([u8arr], filename, {type:mime});//包装file对象用于上传formData.append("uploadFile",file)resolve(res.data)   })},//保存对应图片并上传的按钮触发方法  一键保存上传  saveImg(){//printContent  要保存的图片DOMlet data = await this.base64ImgtoFile(await this.createImg('printContent')));//接口上传代码省略.....}

二维码、条码扫描识别(拍照或上传图片,非实时扫描)
可直接使用:

<template><div class="mt46 input-cells"><div class="flex l-center a-left"><divclass="qr-item mr5 ml5"v-show="false"><imgsrc="#"width="20"height="20"alt=""><inputv-if="isUploadBarCode"class="qr-item-input"@change="toQR"type="file"accept="image/*"capture="camera"></div></div></div>
</template>
<script type="text/ecmascript-6">
import Quagga from 'quagga';
export default {name: '',data () {return {queryParams: {vin: null},isUploadBarCode: true // 控制销毁};},mounted () {},methods: {// 图片 识别 条形码toQR (e) {const that = this;const file0 = e.target.files[0];// console.log('toQR()-file0', file0)this.isUploadBarCode = false;Quagga.decodeSingle({inputStream: {name: 'image',type: 'ImageStream',// size: 1600, // 这里指定图片的大小,需要自己测试一下singleChannel: false},locator: {patchSize: 'medium',halfSample: false},numOfWorkers: 1,decoder: { // ean_reader 这里指定ean条形码,就是国际13位的条形码   code39    code_128readers: ['code_128_reader']},// readers: ['code_128_reader'],locate: true,src: URL.createObjectURL(file0)}, (result) => {console.log('Quagga()-result', result);// let code = result.codeResult.codeif (result && result.codeResult) {that.queryParams.vin = result.codeResult.code;// 执行 页面请求刷新} else {that.queryParams.vin = null;console.warn('识别失败,请手动输入');}this.isUploadBarCode = true;});}}
};
</script><style scoped>.input-cells{display: flex;justify-content:space-between;align-items: center;position: relative;background-color: #fff;overflow: hidden;padding: .06rem .15rem;height: .32rem;line-height: .32rem;font-size: .14rem;}.input-label{margin-left: 0;font-size: .14rem;width: .9rem;}.input-cells>input{font-size: .14rem;text-align: right;}.input-cells>img{width: .06rem;height: .1rem;margin-right: .03rem;}.qr-item{width: .3rem;height: 100%;background-size: 120%;position: relative;overflow: hidden;border: 1px solid #dae7f6;background-color: #f5f5f5;}.qr-item-input{opacity: 0;width: 100%;height: 100%;background-size: 100%;position: absolute;top: 0;left: 0;}/*common*/.flex{display: flex;}.a-center{align-items: center;}.f-fl{float: left;}.ml5{margin-left: .05rem;}.mr10{margin-right: .1rem;}
</style>

实际开发踩坑:
注意使用Quagga库,调用摄像头拍照扫描时,最好将二维码下方的文字清除,否则会非常影响识别率
在这里插入图片描述
html2canvas踩坑:

完美解决html导出且分页 解决图片显示不全问题
https://blog.csdn.net/qq_40044912/article/details/108319294

普通的打印方式

//curPrint是要打印html元素内容的idlet subOutputRankPrint = document.getElementById('curPrint');let newContent = subOutputRankPrint.innerHTML;let oldContent = document.body.innerHTML;document.body.innerHTML = newContent;window.print();document.body.innerHTML = oldContent;// window.location.reload();

解决打印背景色丢失问题

		//解决内容分页问题page-break-before:always;//解决火狐浏览器打印print-color-adjust: exact;color-adjust: exact;//webkit 为Google Chrome、Safari等浏览器内核-webkit-print-color-adjust: exact;

http://chatgpt.dhexx.cn/article/Ui8FjLIJ.shtml

相关文章

JsBarcode:JS条形码生成

Jquery 下载地址&#xff1a;http://www.jq22.com/jquery-info122 JsBarcode 下载地址&#xff1a;http://www.jq22.com/jquery-info15657 <!DOCTYPE html> <html > <head> <meta charset"UTF-8"> <title>JS生成条形码</title&g…

JsBarcode 安装、使用、生成条形码的容器 及 参数配置options。 还存在的问题:条形码总体的宽度设置问题

JsBarcode目录 实现的效果&#xff1a;自己写的代码&#xff1a;一、JsBarcode介绍[JsBarcode 官网](https://lindell.me/JsBarcode/) 二、JsBarcode安装三、页面引入使用四、存在的问题&#xff1a;1、条形码总体的宽度&#xff0c;我现在只有调节每条的宽度来调节&#xff1b…

JS 生成条形码(一维码)jsBarcode

jsBarcode 官网 一、安装 script 引入 <script src"JsBarcode.all.min.js"></script>地址&#xff1a;https://cdn.jsdelivr.net/npm/jsbarcode3.11.5/dist/JsBarcode.all.min.js 也可以进官网查看地址。 npm方式 安装&#xff1a; npm install jsb…

Linux 综合性命令及解析

强大命令 一、top – 实时显示系统运行状态二、htop & btop – 互动的进程查看器三、vmstat – 显示虚拟内存状态四、dstat – 全能系统信息统计工具五、glances – 高层次的多子系统概览六、sar – 系统运行状态统计七、du的替代&#xff1a;ncdu八、用sed/grep查找JSON数…

有哪些优秀的科学网站和科研软件推荐给研究生?

ljthyd &#xff0c;食品科学博士&#xff0c;粮食加工 2032 人赞同 写几个常见的我觉得挺好的网站及软件&#xff0c;也不知道你什么学科&#xff0c;就写一些所有学科基本都用得到的吧。 1、小木虫论坛&#xff08; 小木虫论坛 - 学术科研第一站&#xff09;及其APP 这个论坛…

Ubuntu16.04 oh_my_zsh 安装与配置

参考文章 Ubuntu上使终端显示Git分支(oh-my-zsh) oh-my-zsh的安装与基本配置 Ubuntu 下安装oh-my-zsh 前言 之前学习Laravel的时候&#xff0c;经常要切换git分支&#xff0c;然而现有的shell里面不显示分支状态总是要用git st&#xff0c;git br -a显得很是麻烦&#xff0c;于…

二进制正负数转换和移位的规则详解

1、转换规则 二进制整数都是以补码的形式出现的 正数的原码、反码、补码都相同 负数的反码就是正数的原码先把最高位变为1然后其余的位取反 负数的补码就是该负数的反码加1。 2、二进制的移位规则 <<和>> 二进制数&#xff0c;在向右移1位近似表示除以2&#x…

二进制转换是十进制负数处理

二进制转换成十进制&#xff0c;最高位是符号位&#xff0c; 0表示正 1负数 负数求值&#xff1a;反码 在加1 如1111 1111 1001 0100的十进制实际值 反码 0000 0000 0110 1011 在加1 实际值是108 如图&#xff1a;

python小技巧:求32位二进制负数的补码,附剑指offer中的应用

实现方法&#xff1a; 先上操作&#xff0c;python里面的负数直接将其和 0xffffffff 进行 与&#xff08;&&#xff09; 操作即可得到其补码&#xff1a; def func(n):if n<0:nn&0xffffffff #这个是python里面的&#xff0c;python和别的语言存储负数的格式有点区…

android 16进制负数转化,十进制负数转换为二进制、八进制、十六进制的知识分享...

程序猿们或许对二进制都不陌生,二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。但是很多人都会将二进制转换成整数,但是如何用二进制表示负数呢?有的人会说,在二进制前面加个负数符合。而计算机只能认识0 和 1,又怎么去加个额外的负数符号…

pandoc不是内部或外部命令

1.安装pandoc win7&#xff0c;在Anaconda prompt中 pandoc 显示 ‘pandoc’不是内部或外部命令&#xff0c;也不是可运行的程序分析原因&#xff0c;应该是没添加路径&#xff0c; 环境变量中有 “安装环境\Anaconda3\Scripts”&#xff0c;也不知道应该添加啥 我的情况是…

cmd中运行pip显示不是内部或外部命令

如果在使用python pip命令安装库的时候出现了以下报错&#xff0c;可以用下面两种方法解决 C:\Users\小雨>pip pip 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 1. 检查一下是否正确安装了Python。 2. 将Python的安装路径添加到系统环境变量中。通常…

解决:python不是内部或外部命令

在命令行窗口&#xff08;Linux 称为终端&#xff09;中输出 python 命令后&#xff0c;却显示“‘python’不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件”&#xff0c;具体现象如下&#xff1a; 出现此问题&#xff0c;是因为在当前的路径中找不到 Python…

vue不是内部或外部命令

作为一个vue小白&#xff0c;最近为vue安装真是操碎了心。 无论怎么查找网上的教程&#xff0c;还是解决不了“vue不是内部或外部的命令”诸如此类的问题。 好在功夫不负有心人&#xff0c;终于在多次的试验下&#xff0c;成功解决了这个问题。 第一种情况&#xff1a; vue不…

cmd运行ping不是内部或外部命令_处理CMD系统提示不是内部或外部命令也不是可运行的程序或批处理文件的方案...

近几日有网友询问小编&#xff0c;声称自己在运行CMD命令提示符窗口&#xff0c;出现不是内部或外部命令也不是可运行的程序或批处理。这种故障是怎么产生的呢&#xff1f;其实很简单&#xff0c;就是因为系统环境变量异常&#xff0c;只要我们能重新配置系统默认值就可以修复好…

Python pip不是内部或外部命令怎么办

目录 1.打开此电脑​编辑 2.点击右上角的三个点找到属性​编辑 3.找到高级系统设置​编辑 4.点击环境变量​编辑 5.点击Pyth&#xff0c;再点击编辑 ​编辑 6.点击新建&#xff0c;并将“7”中复制的路径粘贴上来 ​编辑 7.找到你自己Python安装的盘&#xff0c;点进去&a…

‘node‘ 不是内部或外部命令

问题详情&#xff1a; 输入命令&#xff0c;提示&#xff1a;node 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 解决办法&#xff1a; 1、点击高级系统设置 2、点击环境变量 3、点击新增按钮&#xff0c;填写变量名和变量值&#xff0c;点击“确定”按钮…

Vue 不是内部或外部命令解决办法

‘vue’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件 今天被这个问题困扰很久&#xff0c;所以写篇文章总结一下&#xff0c;避免下次再遇到同样的问题导致大量时间流逝 解决这个问题的方法就是找到vue.cmd这个文件存在的目录&#xff0c;一般是这个目录&…

cmd运行jmeter提示不是内部或外部命令

学习jmeter生成报告的时候&#xff0c;运行生成报告的命令&#xff0c;一直提示不是内部或外部命令~~ 如果未生成结果文件&#xff08;.jtl&#xff09;,可运行如下命令生成报告: jmeter -n -t source.jmx -l result.jtl -e -o /tmp/ResultReport 参数: -n &#xff1a;以非…

jps不是内部或外部命令

JPS不是内部或外部命令 需要把Path环境变量中的JDK和JRE的bin分开 原来&#xff1a; 更改后&#xff1a; 终端可以使用jps命令&#xff1a;