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动画效果代码3
Apr 03 Javascript
JavaScript 基础知识 被自己遗忘的
Oct 15 Javascript
javascript对数组的常用操作代码 数组方法总汇
Jan 27 Javascript
基于jquery的二级联动菜单实现代码
Apr 25 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
Jun 30 Javascript
AngularJS创建自定义指令的方法详解
Nov 03 Javascript
jQuery制作图片旋转效果
Feb 02 Javascript
你有必要知道的10个JavaScript难点
Jul 25 Javascript
Vue官网todoMVC示例代码
Jan 29 Javascript
详解Axios统一错误处理与后置
Sep 26 Javascript
对angularjs框架下controller间的传值方法详解
Oct 08 Javascript
手写Spirit防抖函数underscore和节流函数lodash
Mar 22 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
关于我转生变成史莱姆这档事:第二季PV上线,萌王2021年回归
2020/05/06 日漫
解析php中static,const与define的使用区别
2013/06/18 PHP
php实现RSA加密类实例
2015/03/26 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
2016/06/15 PHP
YII2 实现多语言配置的方法分享
2017/01/11 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
javascript 表格排序和表头浮动效果(扩展SortTable)
2009/04/07 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
2015/02/05 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
JavaScript脚本库编写的方法
2015/12/09 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
jQuery实现字符串全部替换的方法【推荐】
2017/03/09 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
微信小程序onLaunch异步,首页onLoad先执行?
2018/09/20 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
详解element-ui 表单校验 Rules 配置 常用黑科技
2020/07/11 Javascript
vue实现轮播图帧率播放
2021/01/26 Vue.js
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
在Django的视图中使用数据库查询的方法
2015/07/16 Python
Python实现获取磁盘剩余空间的2种方法
2017/06/07 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
Python连接Mysql进行增删改查的示例代码
2020/08/03 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
css3 给背景设置渐变色的方法
2019/09/12 HTML / CSS
详解HTML5 canvas绘图基本使用方法
2018/01/29 HTML / CSS
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
英国门把手公司:Door Handle Company
2019/05/12 全球购物
简述网络文件系统NFS,并说明其作用
2016/10/19 面试题
幼儿园六一儿童节活动方案
2014/08/26 职场文书
贫困证明模板(3篇)
2014/09/16 职场文书
大学生暑期社会实践证明范本
2014/10/24 职场文书