vue前端实现将页面显示内容生成pdf文件的几种方法,html2canvas、dom-to-image、jspdf(带分页)基本使用以及介绍

这篇具有很好参考价值的文章主要介绍了vue前端实现将页面显示内容生成pdf文件的几种方法,html2canvas、dom-to-image、jspdf(带分页)基本使用以及介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实际开发需求:vue项目中,根据数据结构生成echarts图表组件,生成带有样式的图表以后,点击下载按钮,把图表以pdf格式的文件下载到本地
实现思路:将vue界面的echarts组件生成图片,然后使用插件将生成的图片放入pdf中,再实现pdf文件的下载
涉及框架以及插件:vue、echarts、html2canvas、dom-to-image、jspdf

插件介绍:

vue、echarts 不用多说,vue前端的框架,echarts用来根据数据生成的带有样式效果的图表;html2canvas与dom-to-image都是将界面上的dom生成图片。

html2canvas

能够实现在用户浏览器端直接对整个或部分页面进行生成图片,主要是将选中的页面或者整个页面渲染成一个canvas图片,通过读取DOM并将不同的样式应用到这些元素上实现。可以通过获取HTML的某个元素,然后生成Canvas,从而生成图片。

安装
npm install --save html2canvas
或 yarn add html2canvas
引入
import html2canvas from 'html2canvas';

用法:

<div class="container" id="myDom1">
  测试
</div>
<style>
.container {
  width:100px;
  height:100px;
  background:red;
  color: #ffffff;
}
</style>
methods(){
  getImage(){
    html2canvas(document.querySelector("#myDom1")).then(canvas => {
        console.logo(canvas)
        document.body.appendChild(canvas);
        var dataUrl = canvas.toDataURL("image/png")
    });
  }
}
参数名称 类型 默认值 描述
allowTaint boolean false 允许跨域
background string #fff canvas的背景颜色,如果没有设定默认透明
height number null canvas高度设定
letterRendering boolean false 在设置了字间距的时候有用
logging boolean false 输出信息
proxy string undefined 代理地址
taintTest boolean true 是否在渲染前测试图片
timeout number 0 图片加载延迟,默认延迟为0,单位毫秒
width number null canvas的宽度
useCORS boolean false 图片跨域问题
dom-to-image

它可以将任意DOM节点转换成用JavaScript编写的矢量(SVG)或光栅(PNG或JPEG)图像。

安装
npm install dom-to-image
或 yarn add dom-to-image
引入
import domtoimage from 'dom-to-image';
或 var domtoimage = require('dom-to-image');

基本用法:

<template>
  <div id=""myDom>
    <el-table
      :data="tableData"
      style="width: 100%">
      <el-table-column
        prop="date"
        label="日期"
        width="180">
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名"
        width="180">
      </el-table-column>
      <el-table-column
        prop="address"
        label="地址">
      </el-table-column>
    </el-table>
    ......
  </div>
</template>
methods(){
  getDomToImage(){
    let dom = document.getElementById('myDom');
    domtoimage.toPng(dom).then(function (dataUrl) {
        var img = new Image();
        img.src = dataUrl;
        document.body.appendChild(img);
    })
    .catch(function (error) {
        console.error('wrong!', error);
    });
  }
}

获取一个png的blob:

domtoimage.toBlob(document.getElementById('myDom')).then(function (blob) {
        console.log(blob)
});
jspdf

jsPDF 是一个使用 Javascript 语言生成 PDF 的开源库。你可以在 Firefox 插件,服务端脚本或是浏览器脚本中使用它。

安装:
npm install jspdf
或 yarn add jspdf
引入
import jsPDF from "jspdf"

基本用法:

let pdf = new jsPDF('p', 'pt', 'a4);
参数1:l:横向  p:纵向
参数2:单位("pt","mm", "cm", "m", "in" or "px")
参数3:格式,默认为“a4”

常用方法:

pdf.addPage()  在PDF文档中添加新页面,参数如下,也可以不设置,默认a4
pdf.addImage()  将图像添加到PDF中
pdf.save(`保存的PDF文件.pdf`); 保存为pdf格式的文件

回到需求:vue项目中,根据数据结构生成echarts图表组件,生成带有样式的图表以后,点击下载按钮,把图表以pdf格式的文件下载到本地(带分页),部分代码如下(思路)文章来源地址https://www.toymoban.com/news/detail-822977.html

1.使用html2canvas
<template>
  <div id="pdfDom" ref="pdfDom">
    // 此处存放界面中显示的内容区域,生成pdf的内容区域......
  </div>
</template>

methods(){
  let node = document.getElementById('pdfDom');
html2canvas(document.getElementById('pdfDom'), {
				scale: 2
			}).then(function (canvas) {
				var pdfWidth = canvas.width;
				var pdfHeight = canvas.height;
				var pageHeight = pdfWidth / 592.28 * 841.89;
				var leftHeight = pdfHeight;
				var position = 0;
				var imgWidth = 595.28;
				var imgHeight = 595.28 / pdfWidth * pdfHeight;
				var pageData = canvas.toDataURL("img/jpeg", 1.0);
				var pdf = new jsPDF('', 'pt', 'a4');
				// 判断打印dom高度是否需要分页,如果需要进行分页处理
				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()
						}
					}
				}
				const aLink = document.createElement('a')
				document.body.appendChild(aLink)
				const url = URL.createObjectURL(_this.toBlob(pdf.output('datauristring')))
				aLink.href = url
				let date = new Date()
				let year = date.getFullYear()
				let month = (date.getMonth() + 1).toString().padStart(2, 0)
				let day = date.getDate().toString().padStart(2, 0)
				let hour = date.getHours().toString().padStart(2, 0)
				let minutes = date.getMinutes().toString().padStart(2, 0)
				let seconds = date.getSeconds().toString().padStart(2, 0)
				aLink.download = '保存的PDF文件-' + '.pdf'
				aLink.click()
				window.URL.revokeObjectURL(url)
			})
}
2.使用dom-to-image
<template>
  <div id="pdfDom" ref="pdfDom">
    // 此处存放界面中显示的内容区域,生成pdf的内容区域......
  </div>
</template>

methods(){
  let node = document.getElementById('pdfDom');
			domtoimage.toJpeg(node, {
				width: node.clientWidth,
				height: node.clientHeight,
				cacheBust: true,
				style: {
					margin: 0,
					background: '#fff',
				}
			}).then(function (dataUrl) {
					console.log(node.clientWidth)
					that.canvasWidth = node.clientWidth;
					that.canvasHeight = node.clientHeight;
					let imgObj = new Image()
					imgObj.src = dataUrl;
					document.documentElement.scrollTop = 0
					//待图片加载完后,将其显示在canvas上
					imgObj.onload = function (img) {
						let canvas = document.getElementById("canvasDom");
						console.log(canvas.width, canvas.height, 'canvas.width')
						canvas.getContext("2d").drawImage(imgObj, 0, 0, that.canvasWidth, that.canvasHeight); //将图片绘制到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) // 大于1页高度时分页
						} else {
							while (leftHeight > 0) {
								PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
								leftHeight -= pageHeight
								position -= 841.89
								if (leftHeight > 0) {
									PDF.addPage()
								}
							}
						}
						const aLink = document.createElement('a')
						document.body.appendChild(aLink)
						const url = URL.createObjectURL(that.toBlob(PDF.output('datauristring')))
						aLink.href = url
						let date = new Date()
						let year = date.getFullYear()
						let month = (date.getMonth() + 1).toString().padStart(2, 0)
						let day = date.getDate().toString().padStart(2, 0)
						let hour = date.getHours().toString().padStart(2, 0)
						let minutes = date.getMinutes().toString().padStart(2, 0)
						let seconds = date.getSeconds().toString().padStart(2, 0)
						aLink.download = '保存的PDF文件-' + '.pdf'
						aLink.click()
						window.URL.revokeObjectURL(url)
					}
					return dataUrl
				})
				.catch(function (error) {
					console.error('wrong!', error);
				});
}

到了这里,关于vue前端实现将页面显示内容生成pdf文件的几种方法,html2canvas、dom-to-image、jspdf(带分页)基本使用以及介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Edge和chrom扩展工具(GoFullPage)实现整页面截图或生成PDF文件

    插件GoFullPage下载:点击免费下载 如果在浏览网页时,有需要整个页面截图或导出PDF文件的需求,这里分享一个Edge浏览器的扩展插件:GoFullPage。 这个工具可以一键实现页面从上到下滚动并截取。  一、打开“管理扩展”(edge://extensions/),打开获取Microsoft Edge扩展。  二、搜

    2024年02月12日
    浏览(41)
  • vue3前端实现全屏显示,元素垂直填满页面

    1、 toggleFullscreen方法实现选定元素全屏展示 2、使用flex属性+ flex-direction 实现垂直布局填满整个页面

    2024年01月16日
    浏览(43)
  • vue 纯前端预览pdf,纯前端实现pdf加水印下载文件也带水印,防止pdf下载

      原理:主要是利用pdfh5这个插件来完成的   使用方法:   1.页面需要有一个容器例子:div id=\\\"demo\\\"/div   2.下载pdfh5插件 npm install pdfh5   (注意:webpack5之后不会下载polyfill 需要手动下载 所以引入pdfh5的时候会报错)   解决方案:下载 node-polyfill-webpack-plugin npm install node-polyfill-

    2024年04月15日
    浏览(68)
  • vue-pdf 单列显示多个pdf页面

    注意:文件要放在public文件夹下,不然会报错:如果文件放在远程服务器上,则直接写远程地址 Warning: Ignoring invalid character \\\"33\\\" in hex string\\\' 原因:读取 PDF 文件时,路径不合法,导致读取不到文件; 在 vue-cli3 脚手架搭建的项目中,读取本地的 PDF 文件需要放到 public 文件夹中

    2024年02月15日
    浏览(53)
  • vue中实现将页面或者div内容导出为pdf格式

    将Vue单页面转成pdf并下载 步骤1:下载对应的库 步骤2:创建一个htmlToPdf.js的js文件, 然后在main.js中全局引用一下,编写如下代码: 步骤三:在vue页面中给需要打印的区域一个div标签,然后给div一个id,id名和htmlToPdf.js中选择的名字一致,代码如下: 步骤四:在data节点中声明一

    2024年02月11日
    浏览(47)
  • VUE框架中实现HTML页面(局部)内容转PDF下载

    有一朋友想把网页内容变成PDF下载下来。问我有没有好办法。 这还真巧了,咱公司也有这个需求,就是网页生成合同,然后可以直接打印合同内容。最早吧,就是可以直接打印就好了。 当时为解决完美打印的问题,挺费劲的,当时第三方插件还有BUG(当然把解决放给发给作

    2023年04月14日
    浏览(57)
  • 【vue2】纯前端实现本地的pdf/word/epub文件预览

    需求是预览本地的pdf/word/epub格式的文件,但是搜索后发现没有可以直接使用的,格式不同,显示的方式和效果也都略有不同。 最后还是 分别实现预览 的功能。 如果只需要预览pdf/word等格式的话,可以使用的方案:vue-office,支持多种文件(docx、excel、pdf)预览的vue组件库,支持

    2024年02月11日
    浏览(76)
  • vue3 如何将页面生成 pdf 导出

    原文链接:vue3 如何将页面生成 pdf 导出 最近工作中有需要将一些前端页面(如报表页面等)导出为 pdf 的需求,博主采用的是 html2Canvas + jspdf 。 请阅读 vue3 如何将页面生成 pdf 导出

    2024年02月16日
    浏览(49)
  • 【vue2】纯前端实现本地的pdf/word/epub文件预览(包括pdf选中文字,epub高亮等)

    需求是预览本地的pdf/word/epub格式的文件,但是搜索后发现没有可以直接使用的,格式不同,显示的方式和效果也都略有不同。 最后还是 分别实现预览 的功能。 如果只需要预览pdf/word等格式的话,可以使用的方案:vue-office,支持多种文件(docx、excel、pdf)预览的vue组件库,支持

    2024年02月11日
    浏览(61)
  • vue 页面内容生成图片\PFD方法

    1.下载插件 2.引入 3.使用方法 在需要生成的内容绑定类名或id,在下面获取元素 js  less样式   效果  点击生成图片或pdf 图片没有宽高大小限制 pdf宽度大概800px,长度也有限制,不建议使用pdf

    2024年01月17日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包