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方法和技巧大全
Dec 27 Javascript
jQuery中[attribute^=value]选择器用法实例
Dec 31 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
Apr 14 Javascript
JavaScript实现斗地主游戏的思路
Feb 29 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
Mar 01 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
Nov 23 Javascript
javascript获取以及设置光标位置
Feb 16 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
Jul 30 Javascript
vue 的keep-alive缓存功能的实现
Mar 22 Javascript
JS中验证整数和小数的正则表达式
Oct 08 Javascript
基于jquery实现彩色投票进度条代码解析
Aug 26 jQuery
vue-video-player视频播放器使用配置详解
Oct 23 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以ROOT权限执行系统命令的方法
2011/02/10 PHP
php中模拟POST传递数据的两种方法分享
2011/09/16 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
Codeigniter通过SimpleXML将xml转换成对象的方法
2015/03/19 PHP
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
2010/03/04 Javascript
js实现动态改变字体大小代码
2014/01/02 Javascript
jQuery中parents()和parent()的区别分析
2014/10/28 Javascript
JavaScript闭包详解
2015/02/02 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
如何用js实现鼠标向上滚动时浮动导航
2016/07/18 Javascript
js实现动态创建的元素绑定事件
2016/07/19 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
Node.js的基本知识简单汇总
2016/09/19 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
Vue 仿QQ左滑删除组件功能
2018/03/12 Javascript
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
vuejs移动端实现div拖拽移动
2019/07/25 Javascript
微信小程序中button去除默认的边框实例代码
2019/08/01 Javascript
解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题
2020/07/21 Javascript
Vue 监听元素前后变化值实例
2020/07/29 Javascript
Vue中component标签解决项目组件化操作
2020/09/04 Javascript
Python中实现的RC4算法
2015/02/14 Python
使用SAE部署Python运行环境的教程
2015/05/05 Python
python中文件变化监控示例(watchdog)
2017/10/16 Python
python编程线性回归代码示例
2017/12/07 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
Python变量访问权限控制详解
2019/06/29 Python
Python实现Kerberos用户的增删改查操作
2020/12/14 Python
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
laravel使用redis队列实例讲解
2021/03/23 PHP
工程师岗位职责
2013/11/08 职场文书
自荐信如何制作?
2014/02/21 职场文书
接收函格式
2015/01/30 职场文书
Pygame游戏开发之太空射击实战敌人精灵篇
2022/08/05 Python