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 相关文章推荐
jqPlot Option配置对象详解
Jul 25 Javascript
jQuery+css实现百度百科的页面导航效果
Dec 16 Javascript
javascript实现动态统计图开发实例
Nov 21 Javascript
简单谈谈JavaScript的同步与异步
Dec 31 Javascript
node.js实现端口转发
Apr 14 Javascript
详解jQuery中的事件
Dec 14 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
Jan 20 Javascript
input输入框内容实时监测(附代码)
Aug 15 Javascript
js中怎么判断两个字符串相等的实例
Jan 17 Javascript
JS module的导出和导入的实现代码
Feb 25 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
Sep 18 Javascript
JS数组方法reduce的用法实例分析
Mar 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中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
PHP 实例化类的一点摘记
2008/03/23 PHP
PHP导入Excel到MySQL的方法
2011/04/23 PHP
thinkPHP实现的省市区三级联动功能示例
2017/05/05 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
PHP使用PDO 连接与连接管理操作实例分析
2020/04/21 PHP
JavaScript Perfection kill 测试及答案
2010/03/23 Javascript
JQuery优缺点分析说明
2011/04/10 Javascript
javaScript arguments 对象使用介绍
2013/10/18 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
2013/12/13 Javascript
Jquery获取和修改img的src值的方法
2014/02/17 Javascript
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
jQuery实现标题有打字效果的焦点图代码
2015/11/16 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
jQuery的deferred对象使用详解
2016/09/25 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
JS数组去重常用方法实例小结【4种方法】
2018/05/28 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
Layui 解决表格异步调用后台分页的问题
2019/10/26 Javascript
python使用calendar输出指定年份全年日历的方法
2015/04/04 Python
Python使用numpy实现BP神经网络
2018/03/10 Python
详解Python循环作用域与闭包
2019/03/21 Python
python利用tkinter实现屏保
2019/07/30 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
python爬虫泛滥的解决方法详解
2020/11/25 Python
eDreams澳大利亚:预订机票、酒店和度假产品
2017/04/19 全球购物
日本最大的旅游网站:Rakuten Travel(乐天旅游)
2018/08/02 全球购物
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
党员干部四风问题整改措施思想汇报
2014/10/12 职场文书
心理健康教育主题班会
2015/08/13 职场文书
自愿离婚协议书范本2016
2016/03/18 职场文书
OpenCV-Python实现图像平滑处理操作
2021/06/08 Python