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 相关文章推荐
JavaScript创建命名空间(namespace)的最简实现
Dec 11 Javascript
Javascript typeof 用法
Dec 28 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
May 03 Javascript
javascript模拟订火车票和退票示例
Apr 24 Javascript
JavaScript实现网页截图功能
Oct 16 Javascript
JavaScript中使用指数方法Math.exp()的简介
Jun 15 Javascript
Javascript将数字转化成为货币格式字符串
Jun 22 Javascript
JS代码实现百度地图 画圆 删除标注
Oct 12 Javascript
JS 终止执行的实现方法
Nov 24 Javascript
微信小程序 label 组件详解及简单实例
Jan 10 Javascript
javascript 使用正则test( )第一次是 true,第二次是false
Feb 22 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
Sep 21 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
解决php写入数据库乱码的问题
2019/09/17 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
jQuery 页面 Mask实现代码
2010/01/09 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
2015/06/05 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
前端js弹出框组件使用方法
2020/08/24 Javascript
jQuery日程管理插件fullcalendar使用详解
2017/01/07 Javascript
Bootstrap面板学习使用
2017/02/09 Javascript
微信小程序slider组件使用详解
2018/01/31 Javascript
vue 修改 data 数据问题并实时显示的方法
2018/08/27 Javascript
npm scripts 使用指南详解
2018/10/08 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
2020/04/11 Javascript
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
[02:11]DOTA2上海特级锦标赛主赛事第二日RECAP
2016/03/04 DOTA
python使用urlparse分析网址中域名的方法
2015/04/15 Python
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
python3.5安装python3-tk详解
2019/04/26 Python
python实现画循环圆
2019/11/23 Python
django框架F&amp;Q 聚合与分组操作示例
2019/12/12 Python
python定义类self用法实例解析
2020/01/22 Python
Python 创建守护进程的示例
2020/09/29 Python
AmazeUI中各种的导航式菜单与解决方法
2020/08/19 HTML / CSS
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
系统管理员的职责包括那些?管理的对象是什么?
2016/09/20 面试题
介绍一下except的用法和作用
2015/01/22 面试题
金融学专业大学生职业生涯规划
2014/03/07 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
导游词格式
2015/02/13 职场文书
小学重阳节活动总结
2015/03/24 职场文书
护士自荐信范文
2015/03/25 职场文书
银行实习推荐信
2015/03/27 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书
人身损害赔偿协议书
2016/03/22 职场文书