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网页关键字高亮代码
Jul 30 Javascript
基于JQuery的Select选择框的华丽变身
Aug 23 Javascript
ajax处理php返回json数据的实例代码
Jan 24 Javascript
php与js的区别是什么
Aug 05 Javascript
jQuery操作JSON的CRUD用法实例
Feb 25 Javascript
基于jQuery实现在线选座之高铁版
Aug 24 Javascript
jquery实现超简洁的TAB选项卡效果代码
Aug 28 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
Dec 28 Javascript
ES6正则表达式扩展笔记
Jul 25 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
Nov 05 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
Sep 02 Javascript
利用 JavaScript 构建命令行应用
Nov 17 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
多文件上载系统完整版
2006/10/09 PHP
php 过滤器实现代码
2010/08/09 PHP
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
2017/10/19 PHP
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
三种Node.js写文件的方式
2016/03/08 Javascript
去除html代码里面的script正则方法
2016/05/19 Javascript
微信小程序使用第三方库Immutable.js实例详解
2016/09/27 Javascript
详解vue-resource promise兼容性问题
2017/06/20 Javascript
解决vue中post方式提交数据后台无法接收的问题
2018/08/11 Javascript
vue后台管理之动态加载路由的方法
2018/08/13 Javascript
Element Input组件分析小结
2018/10/11 Javascript
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
使用Python下载Bing图片(代码)
2013/11/07 Python
Python类的多重继承问题深入分析
2014/11/09 Python
python获取酷狗音乐top500的下载地址 MP3格式
2018/04/17 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
Python 调用 Outlook 发送邮件过程解析
2019/08/08 Python
OpenCV python sklearn随机超参数搜索的实现
2020/01/17 Python
pandas数据拼接的实现示例
2020/04/16 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
使用HTML5里的classList操作CSS类
2016/06/28 HTML / CSS
会计找工作求职信范文
2013/12/09 职场文书
助人为乐表扬信范文
2014/01/14 职场文书
歌唱比赛主持词
2014/03/18 职场文书
党校党性分析材料
2014/12/19 职场文书
爱晚亭导游词
2015/02/09 职场文书
纪录片信仰观后感
2015/06/08 职场文书
保外就医申请书范文
2015/08/06 职场文书
2016年第29个世界无烟日宣传活动总结
2016/04/06 职场文书
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/04/22 无线电
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server