// 阅读须知:因为我是在描述我从头开始做这个批量打包的一个思路,也就是思考历程,所以大家在阅读过后可能会觉得逻辑有点反,为什么要把绘制放到最后面,我是希望能够帮大家分享一下我的分析思路,仅供参考。

一、插件安装

  首先是插件的安装与引入,这里我们用的是qrcode的这个插件,直接使用npm install qrcodejs2安装即可,但是这里要注意,如果你用的是ts进行开发的话,这时候用传统的import将qrcode引进来是不可取的,他会报错:TS7016: Could not find a declaration file for module 'qrcodejs2'. '/node_modules/qrcodejs2/qrcode.js' implicitly has an 'any' type.   Try `npm install @types/qrcodejs2` if it exists or add a new declaration (.d.ts) file containing `declare module 'qrcodejs2';`。这里为什么会出现这个问题,我暂不知道,知道的同学们欢迎留言。不过解决方案的话,我们可以参考这个博客:https://blog.csdn.net/mhbsoft/article/details/92842278,这里博客里面已经说得很详细了。

二、二维码生成

  接下来就是插件的使用了,qrcode这个插件的使用,总体来说还是很简单的,它主要是通过获取dom元素,然后通过HTML5 cavans绘制而成的。首先我们需要在html里定义一个放置二维码的dom元素,

  1. <div id="qrcode">
  2. </div>

然后定义一个方法

  1. qrcode(){
  1.   let qrcode = new this.QRCode('qrcode', {
  2.   width: 272, //图像宽度
  3.   height: 272, //图像高度
  4.   colorDark: "#000000", //前景色
  5.   colorLight: "#ffffff", //背景色
  6.   typeNumber: 4,
  7.   correctLevel: this.QRCode.CorrectLevel.H //容错级别 容错级别有:(1)QRCode.CorrectLevel.L (2)QRCode.CorrectLevel.M (3)QRCode.CorrectLevel.Q (4)QRCode.CorrectLevel.H
  8.   })
  1.   qrcode.clear(); //清除二维码
  2.   qrcode.makeCode(this.data.url);//生成另一个新的二维码
  1. }

然后在mouted里面调用这个方法,但是有的项目的mouted不起作用,我们还可以这样,

  1. created(){
  2. this.$nextTick(()=>{ // $nextTick是指在页面dom元素都加载完了之后再执行里面的方法,从而也起到了一个mouted的作用。
  3. this.qrcode();
  4. })
  5. }

以上就是我们生成二维码的全过程了。

三、二维码打包以及导出

二维码已经生成好了,接下来就是打包了,打包的话这里用到了两个插件,分别是jsZIP以及FileSaver,这两个一个是将文件整合成压缩包一个是生成对应的文件目录,引入方法和上面引入qrcode是一样的。接下来我们来看下这个打包方法的实现:

  1. function downImg(imgArr,title) { // imgArr是我们要下载的图片列表,title就是你下载出来的压缩包的名称
  2. var zip = new JSZip();
  3. var file_name = '';
  4. for(let i=0;i<imgArr.length;i++) { // 循环我们传进来的图片列表,为每一张图片赋值
  5. let item = imgArr[i].img
  6. let name = imgArr[i].hospital+imgArr[i].department+ imgArr[i].name; // 每一张图片的名字,可以根据自己的规则生成
  7. file_name = title + '.zip'; // 生成的文件的名字
  8. var img = zip.folder(name); // 生成压缩图片
  9. var img_arr = item.split(',');
  10.  
  11. img.file(name + '.png', img_arr[1], {base64: true}); // 生成图片,采用base64格式
  12. }
  13. ·zip.generateAsync({type:"blob"}).then(function(content) {
  14. ·FileSaver.saveAs(content, file_name); // 生成文件,调用saveAs
  15. ·});
  16. }

从上面的代码我们可以看出,我们需要将我们要导出的图片的base64地址拿到,然后才可以调用这个方法,于是接下来我们看怎么将图片转成base64格式。

四、绘制我们需要的图片格式

  一般情况下,我们绘制图片的话,直接用cavans将我们需要绘制的dom元素给转成图片,代码如下:

  1. html2canvas(Dom,{ // Dom就是我们要转成图片的页面节点,可以通过id选择器、类选择器或者refs获取
  2. backgroundColor: null
  3. }).then((canvas) => {
  4. let dataURL = canvas.toDataURL("image/png"); // 这里调用cavans的toDataURL方法来获取转化后的base64格式的路径
  5. this.dataURL = dataURL; // 赋值出去,这里拿到的dataURL的地址就是一个base64格式的地址了,我们可以用它来直接绘制图片
  6. });

  但是,经过我的检测,发现在vue+ts的项目中,他会报错html2cavans这个方法找不到,应该是没有定义这个方法,毕竟ts和js的区别就是ts必须有明确的定义,但是我没有找到有效的声明方法,所以我采用了下面的第二种方法

  1. drawImg(){ // 定义一个方法,来绘制我们要导出的二维码var canvas=document.createElement("canvas"); // 创建一个cavans元素
  2. canvas.width = 510;  // 定义cavans宽高,也是我们导出的图片的宽高
  3. canvas.height = 700;
  4. var ctx=canvas.getContext("2d")!; // 定义一个变量来进行cavans的二维绘制
  5. var img= new Image(); // 新建一个图片元素
  6. // 给图片赋值,一般这里是要放绝对路径的,如果找不到绝对路径的话,可以用require的方式来定义,let bgImg = require('../assets/image/bg.png')
     img.src = bgImg;   
  7. img.onload = ()=>{ // 这里之所以用onload,是要等图片绘制完成了再干其他的事情,否则的话可能出现最后导出的图片没有背景图的情况,因为绘制图片相当于一个异步的过程,踩坑踩坑
  8. ctx.drawImage(img,10,10); // 绘制图片,里面的后两个参数是坐标
  9. ctx.fillStyle="#ffffff"; // 设置填充色,为下面的矩形
  10. ctx.fillRect(114,240,276,276); // 绘制一个矩形,前两个参数是坐标,后两个参数是矩形的宽高
  11.  
  12. let img2 = new Image();
  13.    // 下面我们该将二维码绘制上去了,首先因为二维码是我们借助qrcode生成的,所以我们需要获取到生成的二维码的src,但是我暂时还没有找到方法获取qrcode生成的二维码的路径,所以只能采用下方的这种方式,因为qrcode其实已经将生成的二维码绘制到页面上指定的标签里面了,
      // 所以我们可以通过去寻找生成的img元素,并且通过cas.toDataURL的方法去获取相应的路径。
  14. let cas:any = document.querySelector('#qrcode')!.children[this.index*2];
  15. var data1 = cas.toDataURL('image/jpg');
  16. img2.src = data1;
  17. img2.onload = ()=>{ // 这里同样是避免异步
  18. ctx.drawImage(img2,115,242);
  19. ctx.font="30px PingFangSC-Semibold"; // 这里是绘制文字
  20. ctx.fillStyle = '#1C3063'; // 文字颜色
  21. ctx.textAlign='center'; // 设置文字的位置,居中还是左右对齐,居中对齐的中心位置就是下面设置的坐标,同理,左右对齐的相对位置也是以下方的坐标为准的
  22. ctx.fillText(this.data.name!+' '+this.data.position!,255,600); // 设置文字的内容,第一个参数是文字容,第二三个参数是坐标
  23. let dependce = this.data.hospital!+' '+this.data.department!;
  24. if(dependce){ // 这里是做了一个如果文字超过18个字,就开始换行,并且仍旧是居中对齐
  25. if(dependce.length >10){
  26. ctx.font="26px PingFangSC-Semibold";
  27. ctx.fillStyle = '#1C3063';
  28. ctx.textAlign='center';
  29. ctx.fillText(dependce.slice(0,18)!,255,650);
  30.  
  31. ctx.font="26px PingFangSC-Semibold";
  32. ctx.fillStyle = '#1C3063';
  33. ctx.textAlign='center';
  34. ctx.fillText(dependce.slice(18)!,255,678); // 这个坐标点的位置也需要重新计算
  35. }else{
  36. ctx.font="26px PingFangSC-Semibold";
  37. ctx.fillStyle = '#1C3063';
  38. ctx.textAlign='center';
  39. ctx.fillText(dependce,255,650);
  40. }
  41. }
  42. let data = canvas.toDataURL(); // 这里其实我们的图就画好了,接下来就是根据自己的代码逻辑进行操作了。
        // 这里是将我们需要的一些参数尤其是生成的图片放到一个数组中去,然后传递到父级。
  43. this.exportArr.push({hospital: this.data.hospital!,department:this.data.department!,name:this.data.name!,img:data});
  44. this.$emit('exportArr',this.exportArr);// 如果不需要向父组件传值的话,可以省略
  45. }
  46. }
  47.  
  48. }

  经过上面的方法,我们其实就可以拿到绘制好的图片的base64格式了,我们就可以执行上面的导出过程了。

  

  1. // 给图片元素赋值,这里的bgImg最好是一个绝对路径,如果是相对路径的话,需要借助

在ts+vue中实现前端批量下载打包二维码的更多相关文章

  1. Java中使用google.zxing快捷生成二维码(附工具类源码)

    移动互联网时代,基于手机端的各种活动扫码和收付款码层出不穷:那我们如何在Java中生成自己想要的二维码呢?下面就来讲讲在Java开发中使用 google.zxing 生成二维码. 一般情况下,Java ...

  2. vue常用插件之打印功能、二维码插件、批量打印二维码

    vue实现打印的两种方法 vue实现批量打印二维码 (需安装二维码插件qrcodejs2) 一.vue-print-nb插件 1.安装: npm i vue-print-nb -S 2.全局注册(ma ...

  3. Laravel5中通过SimpleQrCode扩展包生成二维码实例

    Simple Qrcode是基于强大的Bacon/BaconQrCode库开发的针对Laravel框架的封装版本,用于在Laravel中为生成二维码提供接口. 安装SimpleQrCode扩展包 在项 ...

  4. 前端QRCode.js生成二维码(解决长字符串模块和报错问题)

    QRCode 用法 1.使用npm安装到你的项目中 npm install qrcode2 --save 使用commonjs或者es6模块方式导入 var QRCode = require('qrc ...

  5. Vue中将网址、动态网址转为二维码

    1. 首先需要安装相关的依赖包 npm install qrcodejs2 --save 或者 npm install qrcode2 --save 这里选择第二种方式进行安装,如图: 2.templ ...

  6. 前端用网址生成二维码(jquery)

    1.加载jquery.qrcode.min.js 2.html部分: 3.js部分:url为生成二维码的网址 附: jquery.qrcode.min.js下载 链接:https://pan.baid ...

  7. Vue前端利用qrcode生成二维码

    <div id="qrcode" style="width: 560px;height: 560px;background-color: white;"& ...

  8. 草料生成app自动下载的二维码

    草料官网http://cli.im/app 填写iOS和安卓的appid就好了

  9. (转: daifubing的博客 )Delphi二维码中文支持、分组、批量打印经验小结

    一直也没接触到什么复杂的报表,都是一些简单的报表,在DelphI下使用QuickReport一般也就能满足需要了,由于公司现在需求的变化,对条码扫描提出了新的要求,主要是扫码要包含更多地内容,以前的一 ...

随机推荐

  1. Hadoop 三剑客之 —— 分布式计算框架 MapReduce

    一.MapReduce概述 二.MapReduce编程模型简述 三.combiner & partitioner 四.MapReduce词频统计案例         4.1 项目简介      ...

  2. 手动实现 SpringMVC

    前几章我们已经分析了 Spring 的源码并且手动实现了一个 IOC/DI 容器. 这章我们在自己实现的 Spring 框架的基础上实现一个 SpringMVC 框架. 我们自己实现的 Spring ...

  3. Oracle分组函数之ROLLUP用法

    rollup函数 本博客简单介绍一下oracle分组函数之rollup的用法,rollup函数常用于分组统计,也是属于oracle分析函数的一种 环境准备 create table dept as s ...

  4. 基于STM32之UART串口通信协议(三)接收

    一.前言 1.简介 回顾上一篇UART发送当中,已经讲解了如何实现UART的发送操作了,接下来这一篇将会继续讲解如何实现UART的接收操作. 2.UART简介 嵌入式开发中,UART串口通信协议是我们 ...

  5. CentOS7.3安装JIRA7.10

    准备工作:下载相关安装包,上传到服务器/opt/apps目录下 链接:https://pan.baidu.com/s/15Y5Y3X6AX2ZokWkZKcRrQQ 密码:q0lw 1.安装数据库 y ...

  6. 在 ASP.NET Web API 中使用 Attribute 统一处理异常

    并非所有的异常都需要 try-catch 进行重复的处理,这会导致大量的重复性代码,一旦后续系统出现异常处理机制的修改,随着代码量增多,修改也会变的更加困难. ASP.NET Web API 中特别增 ...

  7. Python的空行

    函数之间或类的方法之间用空行分隔,表示一段新的代码的开始.类和函数入口之间也用一行空行分隔,以突出函数入口的开始. 空行与代码缩进不同,空行并不是Python语法的一部分.书写时不插入空行,Pytho ...

  8. 什么是JS跨域请求

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  9. 常用的方法论-PDCA

  10. scrapy基础知识之制作 Scrapy 爬虫 一共需要4步:

    1.新建项目 (scrapy startproject xxx):新建一个新的爬虫项目 2.明确目标 (编写items.py):明确你想要抓取的目标 3.制作爬虫 (spiders/xxspider. ...