Vue使用jspdf和html2canvas组件库结合导出PDF文件

效果图:

1、安装依赖:

javascript 复制代码
npm install html2canvas --save
npm install jspdf --save
或
yarn add html2canvas --save
yarn add jspdf --save

2、封装全局调用方法:this.$exportPDF('#id','文件名')

新建js文件:@/utils/html2Pdf.js(文件名、位置自义,挂载路径正确即可)

javascript 复制代码
import Vue from 'vue'
// 导出页面为PDF格式
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'

/**
 * @param {String} id    html节点标签id名
 * @param {String} title 导出PDF的文件名||不传默认zxy.pdf
 */

Vue.prototype.$exportPDF = function(id, title = 'zxy') {
	html2Canvas(document.querySelector(id), {
		allowTaint: true,
		taintTest: false,
		useCORS: true, //是否尝试使用CORS从服务器加载图像
		dpi: window.devicePixelRatio * 4, // 将分辨率提高到特定的DPI 提高四倍
		scale: 4, // 按比例增加分辨率
		logging: true, // 可以长屏分页导出
		async: false, //是否异步解析和呈现元素
	}).then(function(canvas) {
		let contentWidth = canvas.width
		let contentHeight = canvas.height
		let pageHeight = contentWidth / 592.28 * 841.89 // 一页pdf显示html页面生成的canvas高度;
		let leftHeight = contentHeight //未生成pdf的html页面高度
		let position = 0 //pdf页面偏移
		//a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
		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一页显示的范围,是否分页
			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文件

javascript 复制代码
import '@/utils/html2Pdf';

4、页面使用:

设置需要导出HTML节点id名:

html 复制代码
<div style="width: 700px; padding: 18px;" id='printBill'>
        .....
</div>

调用导出PDF方法:

javascript 复制代码
exportPDF() {
	this.$exportPDF('#printBill','结算票据')//id名必传,PDF文件名可传可不传
},
相关推荐
万少2 小时前
Vibe Coding不停歇,移动端 TRAE SOLO 让你用手机也能编程啦
前端·javascript·后端
kyriewen112 小时前
WebAssembly:前端界的“外挂”,让C++代码在浏览器里跑起来
开发语言·前端·javascript·c++·单元测试·ecmascript
烛衔溟3 小时前
TypeScript 接口的基本使用 —— 定义对象形状
前端·javascript·typescript
IT乐手4 小时前
Claude Code + Qwen 的配置方法
javascript·claude
子兮曰6 小时前
DeepSeek TUI:原生 Rust 打造的终端 AI 编码 Agent
前端·javascript·后端
暗不需求6 小时前
# 深入 React Todos:从零实现一个状态提升与本地持久化的待办应用
javascript·react.js·全栈
子兮曰6 小时前
深入 Superpowers:180k Stars 的开源 AI 编程方法论是如何工作的
前端·javascript·后端
不会敲代码16 小时前
从零到一:用 Vue3 + Kimi 大模型打造「拍照记单词」AI 应用
vue.js·typescript·aigc
隔壁的大叔6 小时前
Markdown 渲染如何穿插自定义组件
前端·javascript·vue.js
薯老板6 小时前
JavaScript原型,原型链
javascript