vue实现pdf导出,解决生成canvas模糊等问题
最近公司项目需要,利用vue实现pdf导出,从而保存到本地打印出来,说起来好像也很容易,具体要怎么实现呢?
1 、我们要添加两个模块
- 第一个.将页面html转换成图片
- npm install --save html2canvas
- 第二个.将图片生成pdf
- 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 =
- 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', , , imgWidth, imgHeight)
- } else {
- while (leftHeight > ) {
- PDF.addImage(pageData, 'JPEG', , position, imgWidth, imgHeight)
- leftHeight -= pageHeight
- position -= 841.89
- if (leftHeight > ) {
- 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: ,
- canvas: c,
- logging: true,
- width: document.querySelector(dom).width,
- height: document.querySelector(dom).height
- };
- c.width = document.querySelector(dom).width *
- c.height = document.querySelector(dom).height *
- c.getContext("2d").scale(, );
- 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 =
- 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', , , imgWidth, imgHeight)
- } else {
- while (leftHeight > ) {
- PDF.addImage(pageData, 'JPEG', , position, imgWidth, imgHeight)
- leftHeight -= pageHeight
- position -= 841.89
- if (leftHeight > ) {
- PDF.addPage()
- }
- }
- }
- PDF.save(title + '.pdf')
- }
- )
- }
- }
- }
vue实现pdf导出,解决生成canvas模糊等问题的更多相关文章
- 解决html5 canvas 绘制字体、图片与图形模糊问题
html5 canvas 绘制字体.图片与图形模糊问题 发生情况 多出现在高dpi设备,这意味着每平方英寸有更多的像素,如手机,平板电脑.当然很多高端台式电脑也有高分辨率高dpi的显示器. canva ...
- jquery插件导出excel和pdf(解决中文乱码问题)
参考文件:http://jackyrong.iteye.com/blog/2169683 https://my.oschina.net/aruan/blog/418980 https://segmen ...
- Java实现PDF和Excel生成和数据动态插入以及导出
一.序言 Excel.PDF的导出.导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便记个笔记以防下次遇到相同的问题而束手无策. 公司有这么两个需求: 需求一.给了一个表单,让把 ...
- Vue.js +pdf.js 处理响应pdf文件流数据,前端转图片预览不可下载
使用场景及原因 实际业务中,一些说明书或协议仅支持用户在线预览,为避免用户自行下载,并进行修改,引发纠纷,特将文件已文件流的形式,传给前端并转为图片显示,此时可能会有人问,为什么不直接在后端转图片,前 ...
- Jasperreports以及iReport4.5报表PDF导出字体完美解决方案
在使用Jasperreports以及iReport设计报表时,导出PDF是一个常见的需求.网上解决PDF导出中文显示问题相关的文章很多,无非就是设置控件的pdf font name和pdf encod ...
- iReport 5.6.0 PDF导出中文不显示问题 解决方案
问题描述 iReport 5.6.0 PDF格式导出,中文不显示. 报错信息如下: Error exporting print... Could not load the following font ...
- vue将表格导出为excel
vue将表格导出为excel 一:在项目中需要安装2个依赖项,如下命令: npm install --save file-saver xlsx 二:在vue文件中如下使用即可: <templat ...
- django生成文件txt、pdf(在生成 PDF 文件之前,需要安装 ReportLab 库)
from django.http import HttpResponse def download_file(request): # Text file #response = HttpRespons ...
- java根据pdf模版动态生成pdf
java根据pdf模版动态生成pdf package com.utils; import java.io.ByteArrayOutputStream; import java.io.File; imp ...
随机推荐
- Java探索之旅(13)——字符串类String
1.初始化 String类是Java预定义类,非基本类型而是引用类型. public class StudyString { public static void main(String[] args ...
- 【总结整理】javascript的函数在if中调用时是否加括号---与.net的不同之处
javascript的函数调用时是否加括号 if(event.preventDefault){ event.preventDefault(); if判断条件里面不要加括号,不加括号是应该以属性形式,i ...
- sql 删除重复数据保留一条
--创建测试表 CREATE TABLE TEST ( DEPTNO ), DNAME ), LOC ) ); --插入测试数据 , 'test1', 'test2'); , 'test1', 'te ...
- 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 ...
- html span
提示:请使用 <span> 来组合行内元素,以便通过样式来格式化它们.注释:span 没有固定的格式表现.当对它应用样式时,它才会产生视觉上的变化.以上是w3上的标准解释,另外span是个 ...
- HDU 5971 Wrestling Match (二分图)
题意:给定n个人的两两比赛,每个人要么是good 要么是bad,现在问你能不能唯一确定并且是合理的. 析:其实就是一个二分图染色,如果产生矛盾了就是不能,否则就是可以的. 代码如下: #pragma ...
- MD5Init-MD5Update-MD5Final
MD5Init是一个初始化函数,初始化核心变量,装入标准的幻数 MD5Update是MD5的主计算过程,inbuf是要变换的字节串,inputlen是长度,这个函数由getMD5ofStr调用,调用之 ...
- 序列化 (C#)
序列化是指将对象转换成字节流,从而存储对象或将对象传输到内存.数据库或文件的过程. 它的主要用途是保存对象的状态,以便能够在需要时重新创建对象. 反向过程称为"反序列化". 序列化 ...
- Python中配置文件解析模块-ConfigParser
Python中有ConfigParser类,可以很方便的从配置文件中读取数据(如DB的配置,路径的配置).配置文件的格式是: []包含的叫section, section 下有option=value ...
- 使用 PHPMailer 发送邮件出现诡异bug,间歇性发送失败
场景 使用PHPMailer的SMTP发送邮件,用的是腾讯企业邮箱 smtp.exmail.qq.com 在邮箱设置里看到配置smtp方法 问题描述 本地windows开发环境发送邮件100%成功 远 ...