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 相关文章推荐
js宝典学习笔记(上)
Jan 10 Javascript
js 获取浏览器高度和宽度值(多浏览器)
Sep 02 Javascript
JavaScript高级程序设计 事件学习笔记
Sep 10 Javascript
javascript对下拉列表框(select)的操作实例讲解
Nov 29 Javascript
javascript搜索框点击文字消失失焦时文本出现
Sep 18 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
Aug 31 Javascript
js实现无缝滚动特效
Dec 20 Javascript
详解如何使用vue-cli脚手架搭建Vue.js项目
May 19 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
Jul 27 Javascript
D3.js实现简洁实用的动态仪表盘的示例
Apr 04 Javascript
VUE Elemen-ui之穿梭框使用方法详解
Jan 19 Javascript
react antd实现动态增减表单
Jun 03 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中cookie的作用域
2008/03/27 PHP
PHP中的use关键字概述
2014/07/23 PHP
Yii实现MySQL多数据库和读写分离实例分析
2014/12/03 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
jQuery判断checkbox是否选中的3种方法
2014/08/12 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
2017/09/06 NodeJs
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
2017/09/20 jQuery
浅谈FastClick 填坑及源码解析
2018/03/02 Javascript
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
详解ES6中的Map与Set集合
2019/03/22 Javascript
JS实现根据详细地址获取经纬度功能示例
2019/04/16 Javascript
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
Python程序中设置HTTP代理
2016/11/06 Python
在python3环境下的Django中使用MySQL数据库的实例
2017/08/29 Python
Python 文件操作的详解及实例
2017/09/18 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
图文详解python安装Scrapy框架步骤
2019/05/20 Python
pyqt5与matplotlib的完美结合实例
2019/06/21 Python
基于python的Paxos算法实现
2019/07/03 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
2019/08/06 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
python解析多层json操作示例
2019/12/30 Python
tensorflow中tf.reduce_mean函数的使用
2020/04/19 Python
详解Anaconda安装tensorflow报错问题解决方法
2020/11/01 Python
Pat McGrath Labs官网:世界上最有影响力的化妆师推出的彩妆品牌
2018/01/07 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
介绍一下木马病毒的种类
2015/07/26 面试题
大学生创业计划书的范文
2014/01/07 职场文书
电焊工岗位职责
2014/03/06 职场文书
大学毕业寄语大全
2014/04/10 职场文书
投资申请报告
2015/05/19 职场文书
如何用JavaScript检测当前浏览器是无头浏览器
2021/04/27 Javascript