最近公司项目需要,利用vue实现pdf导出,从而保存到本地打印出来,说起来好像也很容易,具体要怎么实现呢?

1 、我们要添加两个模块

  1. 第一个.将页面html转换成图片
  2. npm install --save html2canvas
  3. 第二个.将图片生成pdf
  4. npm install jspdf --save

2、定义全局函数..创建一个htmlToPdf.js文件在指定位置.我个人习惯放在('src/utils/htmlToPdf')

  1. // 导出页面为PDF格式
  2. import html2Canvas from 'html2canvas'
  3. import JsPDF from 'jspdf'
  4. export default{
  5. install (Vue, options) {
  6. Vue.prototype.getPdf = function () {
  7. var title = this.htmlTitle
  8. html2Canvas(document.querySelector('#pdfDom'), {
  9. allowTaint: true
  10. }).then(function (canvas) {
  11. let contentWidth = canvas.width
  12. let contentHeight = canvas.height
  13. let pageHeight = contentWidth / 592.28 * 841.89
  14. let leftHeight = contentHeight
  15. let position =
  16. let imgWidth = 595.28
  17. let imgHeight = 592.28 / contentWidth * contentHeight
  18. let pageData = canvas.toDataURL('image/jpeg', 1.0)
  19. let PDF = new JsPDF('', 'pt', 'a4')
  20. if (leftHeight < pageHeight) {
  21. PDF.addImage(pageData, 'JPEG', , , imgWidth, imgHeight)
  22. } else {
  23. while (leftHeight > ) {
  24. PDF.addImage(pageData, 'JPEG', , position, imgWidth, imgHeight)
  25. leftHeight -= pageHeight
  26. position -= 841.89
  27. if (leftHeight > ) {
  28. PDF.addPage()
  29. }
  30. }
  31. }
  32. PDF.save(title + '.pdf')
  33. }
  34. )
  35. }
  36. }
  37. }

3、在main.js中使用我们定义的函数文件。

  1. import htmlToPdf from '@/components/utils/htmlToPdf'
  2. Vue.use(htmlToPdf)

4、在需要的导出的页面..调用我们的getPdf方法即可.

  1. <div class="row" id="pdfDom" style="padding-top: 55px;background-color:#fff;">
  2. //给自己需要导出的ui部分.定义id为"pdfDom".此部分将就是pdf显示的部分
  3. </div>
  4. <button type="button" class="btn btn-primary"v-on:click="getPdf()">导出PDF</button>
  1. export default {
  2. data () {
  3. return {
  4. htmlTitle: '页面导出PDF文件名'
  5. }
  6. }
  7. }

到这里大家会发现功能是可以实现了,但是会有个致命的问题,导出来的pdf打印出来还是比较模糊的,那么,针对这个问题,我们要怎么解决呢?

我们的思路是:将canvas的属性width和height属性放大为2倍,最后将canvas的css样式width和height设置为原来1倍的大小即可,也就是,先将canvas高分辨率输出,再来压缩导出打印,即可,废话不多说,完整代码如下:

  1. // 导出页面为PDF格式
  2. import html2Canvas from 'html2canvas'
  3. import JsPDF from 'jspdf'
  4. export default{
  5. install (Vue, options) {
  6. Vue.prototype.getPdf = function (dom,title) {
  7. var title = title
  8. var c = document.createElement("canvas")
  9. var opts = {
  10. scale: ,
  11. canvas: c,
  12. logging: true,
  13. width: document.querySelector(dom).width,
  14. height: document.querySelector(dom).height
  15. };
  16. c.width = document.querySelector(dom).width *
  17. c.height = document.querySelector(dom).height *
  18. c.getContext("2d").scale(, );
  19. html2Canvas(document.querySelector(dom), opts).then(function (canvas) {
  20. let contentWidth = canvas.width
  21. let contentHeight = canvas.height
  22. let pageHeight = contentWidth / 592.28 * 841.89
  23. let leftHeight = contentHeight
  24. let position =
  25. let imgWidth = 595.28
  26. let imgHeight = 592.28 / contentWidth * contentHeight
  27. let pageData = canvas.toDataURL('image/jpeg', 1.0)
  28. let PDF = new JsPDF('', 'pt', 'a4')
  29. if (leftHeight < pageHeight) {
  30. PDF.addImage(pageData, 'JPEG', , , imgWidth, imgHeight)
  31. } else {
  32. while (leftHeight > ) {
  33. PDF.addImage(pageData, 'JPEG', , position, imgWidth, imgHeight)
  34. leftHeight -= pageHeight
  35. position -= 841.89
  36. if (leftHeight > ) {
  37. PDF.addPage()
  38. }
  39. }
  40. }
  41. PDF.save(title + '.pdf')
  42. }
  43. )
  44. }
  45. }
  46. }

vue实现pdf导出,解决生成canvas模糊等问题的更多相关文章

  1. 解决html5 canvas 绘制字体、图片与图形模糊问题

    html5 canvas 绘制字体.图片与图形模糊问题 发生情况 多出现在高dpi设备,这意味着每平方英寸有更多的像素,如手机,平板电脑.当然很多高端台式电脑也有高分辨率高dpi的显示器. canva ...

  2. jquery插件导出excel和pdf(解决中文乱码问题)

    参考文件:http://jackyrong.iteye.com/blog/2169683 https://my.oschina.net/aruan/blog/418980 https://segmen ...

  3. Java实现PDF和Excel生成和数据动态插入以及导出

    一.序言 Excel.PDF的导出.导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便记个笔记以防下次遇到相同的问题而束手无策. 公司有这么两个需求: 需求一.给了一个表单,让把 ...

  4. Vue.js +pdf.js 处理响应pdf文件流数据,前端转图片预览不可下载

    使用场景及原因 实际业务中,一些说明书或协议仅支持用户在线预览,为避免用户自行下载,并进行修改,引发纠纷,特将文件已文件流的形式,传给前端并转为图片显示,此时可能会有人问,为什么不直接在后端转图片,前 ...

  5. Jasperreports以及iReport4.5报表PDF导出字体完美解决方案

    在使用Jasperreports以及iReport设计报表时,导出PDF是一个常见的需求.网上解决PDF导出中文显示问题相关的文章很多,无非就是设置控件的pdf font name和pdf encod ...

  6. iReport 5.6.0 PDF导出中文不显示问题 解决方案

    问题描述 iReport 5.6.0 PDF格式导出,中文不显示. 报错信息如下: Error exporting print... Could not load the following font ...

  7. vue将表格导出为excel

    vue将表格导出为excel 一:在项目中需要安装2个依赖项,如下命令: npm install --save file-saver xlsx 二:在vue文件中如下使用即可: <templat ...

  8. django生成文件txt、pdf(在生成 PDF 文件之前,需要安装 ReportLab 库)

    from django.http import HttpResponse def download_file(request): # Text file #response = HttpRespons ...

  9. java根据pdf模版动态生成pdf

    java根据pdf模版动态生成pdf package com.utils; import java.io.ByteArrayOutputStream; import java.io.File; imp ...

随机推荐

  1. Java探索之旅(13)——字符串类String

    1.初始化 String类是Java预定义类,非基本类型而是引用类型. public class StudyString { public static void main(String[] args ...

  2. 【总结整理】javascript的函数在if中调用时是否加括号---与.net的不同之处

    javascript的函数调用时是否加括号 if(event.preventDefault){ event.preventDefault(); if判断条件里面不要加括号,不加括号是应该以属性形式,i ...

  3. sql 删除重复数据保留一条

    --创建测试表 CREATE TABLE TEST ( DEPTNO ), DNAME ), LOC ) ); --插入测试数据 , 'test1', 'test2'); , 'test1', 'te ...

  4. byte和int转换

    byte b1=1,b2=2,b3,b6; final byte b4=4,b5=6; b6=b4+b5; b3=(b1+b2); System.out.println(b3+b6); b3=b1+b ...

  5. html span

    提示:请使用 <span> 来组合行内元素,以便通过样式来格式化它们.注释:span 没有固定的格式表现.当对它应用样式时,它才会产生视觉上的变化.以上是w3上的标准解释,另外span是个 ...

  6. HDU 5971 Wrestling Match (二分图)

    题意:给定n个人的两两比赛,每个人要么是good 要么是bad,现在问你能不能唯一确定并且是合理的. 析:其实就是一个二分图染色,如果产生矛盾了就是不能,否则就是可以的. 代码如下: #pragma ...

  7. MD5Init-MD5Update-MD5Final

    MD5Init是一个初始化函数,初始化核心变量,装入标准的幻数 MD5Update是MD5的主计算过程,inbuf是要变换的字节串,inputlen是长度,这个函数由getMD5ofStr调用,调用之 ...

  8. 序列化 (C#)

    序列化是指将对象转换成字节流,从而存储对象或将对象传输到内存.数据库或文件的过程. 它的主要用途是保存对象的状态,以便能够在需要时重新创建对象. 反向过程称为"反序列化". 序列化 ...

  9. Python中配置文件解析模块-ConfigParser

    Python中有ConfigParser类,可以很方便的从配置文件中读取数据(如DB的配置,路径的配置).配置文件的格式是: []包含的叫section, section 下有option=value ...

  10. 使用 PHPMailer 发送邮件出现诡异bug,间歇性发送失败

    场景 使用PHPMailer的SMTP发送邮件,用的是腾讯企业邮箱 smtp.exmail.qq.com 在邮箱设置里看到配置smtp方法 问题描述 本地windows开发环境发送邮件100%成功 远 ...