vue实现pdf导出解决生成canvas模糊等问题(推荐)


Posted in Javascript onOctober 18, 2018

最近公司项目需要,利用vue实现pdf导出,从而保存到本地打印出来,说起来好像也很容易,具体要怎么实现呢?

1  、我们要添加两个模块

1 第一个.将页面html转换成图片
2 npm install --save html2canvas
3 第二个.将图片生成pdf
4 npm install jspdf --save

2 、定义全局函数 .. 创建一个htmlToPdf .js 文件在指定位置 . 我个人习惯放在 ( ' src /utils/htmlToPdf' )

// 导出页面为PDF格式
 import html2Canvas from 'html2canvas'
 import JsPDF from 'jspdf'
 export default{
  install (Vue, options) {
   Vue.prototype.getPdf = function () {
    var title = this.htmlTitle
    html2Canvas(document.querySelector('#pdfDom'), {
     allowTaint: true
    }).then(function (canvas) {
     let contentWidth = canvas.width
     let contentHeight = canvas.height
     let pageHeight = contentWidth / 592.28 * 841.89
     let leftHeight = contentHeight
     let position = 0
     let imgWidth = 595.28
     let imgHeight = 592.28 / contentWidth * contentHeight
     let pageData = canvas.toDataURL('image/jpeg', 1.0)
     let PDF = new JsPDF('', 'pt', 'a4')
     if (leftHeight < pageHeight) {
      PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
     } else {
      while (leftHeight > 0) {
       PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
       leftHeight -= pageHeight
       position -= 841.89
       if (leftHeight > 0) {
        PDF.addPage()
       }
      }
     }
     PDF.save(title + '.pdf')
    }
    )
   }
  }
 }

3 、在 main.js 中使用我们定义的函数文件。

import htmlToPdf from '@/components/utils/htmlToPdf'
 Vue.use(htmlToPdf)

4 、在需要的导出的页面 .. 调用我们的 getPdf 方法即可 .

<div class="row" id="pdfDom" style="padding-top: 55px;background-color:#fff;">
   //给自己需要导出的ui部分.定义id为"pdfDom".此部分将就是pdf显示的部分
 </div>
 <button type="button" class="btn btn-primary"v-on:click="getPdf()">导出PDF</button>
 export default {
  data () {
    return {
    htmlTitle: '页面导出PDF文件名'
    }
  }
 }

到这里大家会发现功能是可以实现了,但是会有个致命的问题,导出来的pdf打印出来还是比较模糊的,那么,针对这个问题,我们要怎么解决呢?

我们的思路是:将canvas的属性width和height属性放大为2倍,最后将canvas的css样式width和height设置为原来1倍的大小即可,也就是,先将canvas高分辨率输出,再来压缩导出打印,即可,废话不多说,完整代码如下:

// 导出页面为PDF格式
 import html2Canvas from 'html2canvas'
 import JsPDF from 'jspdf'
 export default{
  install (Vue, options) {
   Vue.prototype.getPdf = function (dom,title) {
    var title = title
    var c = document.createElement("canvas")
    var opts = {
     scale: 2, 
     canvas: c, 
     logging: true, 
     width: document.querySelector(dom).width, 
     height: document.querySelector(dom).height 
    };
    c.width = document.querySelector(dom).width * 2
    c.height = document.querySelector(dom).height * 2
    c.getContext("2d").scale(2, 2);
    html2Canvas(document.querySelector(dom), opts).then(function (canvas) {
     let contentWidth = canvas.width
     let contentHeight = canvas.height
     let pageHeight = contentWidth / 592.28 * 841.89
     let leftHeight = contentHeight
     let position = 0
     let imgWidth = 595.28
     let imgHeight = 592.28 / contentWidth * contentHeight
     let pageData = canvas.toDataURL('image/jpeg', 1.0)
     let PDF = new JsPDF('', 'pt', 'a4')
     if (leftHeight < pageHeight) {
      PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
     } else {
      while (leftHeight > 0) {
       PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
       leftHeight -= pageHeight
       position -= 841.89
       if (leftHeight > 0) {
        PDF.addPage()
       }
      }
     }
     PDF.save(title + '.pdf')
    }
    )
   }
  }
 }

总结

以上所述是小编给大家介绍的vue实现pdf导出解决生成canvas模糊等问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
表单内同名元素的控制
Nov 22 Javascript
基于Jquery的开发个代阴影的对话框效果代码
Jul 28 Javascript
JSON相关知识汇总
Jul 03 Javascript
浅析jQuery Mobile的初始化事件
Dec 03 Javascript
学习javascript面向对象 理解javascript原型和原型链
Jan 04 Javascript
jQuery判断浏览器并动态调整select宽度的方法
Mar 02 Javascript
基于jQuery ligerUI实现分页样式
Sep 18 Javascript
js利用appendChild对标签进行排序的实现方法
Oct 16 Javascript
javascript实现消灭星星小游戏简单版
Nov 15 Javascript
Bootstrap模态框案例解析
Mar 05 Javascript
Vue.js鼠标悬浮更换图片功能
May 17 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
Dec 15 Javascript
vue 指令之气泡提示效果的实现代码
Oct 18 #Javascript
使用JS获取页面上的所有标签
Oct 18 #Javascript
深入理解 Koa 框架中间件原理
Oct 18 #Javascript
JS实现十分钟倒计时代码实例
Oct 18 #Javascript
基于Vue实现可以拖拽的树形表格实例详解
Oct 18 #Javascript
JavaScript的词法结构精华篇
Oct 17 #Javascript
Javascript中parseInt的正确使用方式
Oct 17 #Javascript
You might like
再次研究下cache_lite
2007/02/14 PHP
php url地址栏传中文乱码解决方法集合
2010/06/25 PHP
php生成略缩图代码
2012/07/16 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
2014/04/08 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
原生js实现复制对象、扩展对象 类似jquery中的extend()方法
2014/08/30 Javascript
Javascript基础教程之数组 array
2015/01/18 Javascript
javascript瀑布流布局实现方法详解
2016/02/17 Javascript
详解Vue使用命令行搭建单页面应用
2017/05/24 Javascript
vue模块拖拽实现示例代码
2019/03/09 Javascript
vue路由传参的基本实现方式小结【三种方式】
2020/02/05 Javascript
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
Python 从subprocess运行的子进程中实时获取输出的例子
2019/08/14 Python
Python处理session的方法整理
2019/08/29 Python
在pycharm中显示python画的图方法
2019/08/31 Python
opencv设置采集视频分辨率方式
2019/12/10 Python
Python requests设置代理的方法步骤
2020/02/23 Python
python 函数嵌套及多函数共同运行知识点讲解
2020/03/03 Python
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
提供世界各地便宜的机票:Sky-tours
2016/07/21 全球购物
香港时装购物网站:ZALORA香港
2017/04/23 全球购物
捷克时尚网上商店:OTTO
2018/03/15 全球购物
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
班主任工作年限证明
2014/01/12 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
文明礼仪伴我行演讲稿
2014/05/12 职场文书
2014年学校领导班子对照检查材料
2014/09/19 职场文书
戒毒悔改检讨书
2014/09/21 职场文书
出资证明书范本(标准版)
2014/09/24 职场文书
2015年医德医风工作总结
2015/04/02 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题