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 相关文章推荐
JQuery读取XML文件数据并显示的实现代码
Dec 16 Javascript
JavaScript格式化数字的函数代码
Nov 30 Javascript
使用javascript实现页面定时跳转总结篇
Sep 21 Javascript
jquery滚动特效集锦
Jun 03 Javascript
JavaScript如何自定义trim方法
Jul 28 Javascript
JavaScript使用readAsDataURL读取图像文件
May 10 Javascript
基于angular实现模拟微信小程序swiper组件
Jun 11 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
Jan 08 Javascript
学习React中ref的两个demo示例
Aug 14 Javascript
JS 数组基本用法入门示例解析
Jan 16 Javascript
jquery实现轮播图特效
Apr 12 jQuery
浅谈webpack构建工具配置和常用插件总结
May 11 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使用for语句输出三角形的方法
2015/06/09 PHP
thinkPHP5.0框架模块设计详解
2017/03/18 PHP
数理公式,也可以这么唯美
2021/03/10 无线电
jquery常用技巧及常用方法列表集合
2011/04/06 Javascript
用js获取电脑信息(是使用与IE浏览器)
2013/01/15 Javascript
『JavaScript』限制Input只能输入数字实现思路及代码
2013/04/22 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
2013/10/20 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
jQuery中andSelf()方法用法实例
2015/01/08 Javascript
JS实现的RGB网页颜色在线取色器完整实例
2016/12/21 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
详解Vuex中mapState的具体用法
2017/09/28 Javascript
vue路由拦截及页面跳转的设置方法
2018/05/24 Javascript
Vue导出页面为PDF格式的实现思路
2018/07/31 Javascript
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
2019/06/26 Javascript
微信小程序 云开发模糊查询实现解析
2019/09/02 Javascript
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
2020/08/27 Javascript
[05:29]2014DOTA2国际邀请赛 赛后专访:LGDNewbee顺利过关
2014/07/13 DOTA
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
python实现求两个字符串的最长公共子串方法
2018/07/20 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
浅谈python 读excel数值为浮点型的问题
2018/12/25 Python
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
python实现五子棋小游戏
2020/03/25 Python
python对文件的操作方法汇总
2020/02/28 Python
警校毕业生自我评价
2014/04/06 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
如何写求职信
2014/05/24 职场文书
美丽人生观后感
2015/06/03 职场文书
政审证明材料
2015/06/19 职场文书
2015年教务处干事工作总结
2015/07/22 职场文书
win10电脑双屏显示一个黑屏怎么办?win10电脑双屏显示一个黑屏解决方法
2022/07/15 数码科技