前端通过html2canvas将dom节点生成对应的PDF
创始人
2025-05-31 19:59:41

项目中有一项批阅需求,需要前端将学生的考试报告和老师的批阅生成PDF,然后上传到后端,提供打包下载,也可以单独下载.

1.将这两行代码复制到项目package.json文件中,然后npm i 装包
"jspdf": "^1.5.3",
"html2canvas": "^1.4.1",
2.目录下的创建一个util文件夹,创建一个htmlToPdf.js文件,名字可以自己起
3.导入main文件中
import htmlToPdf from '@/util/htmlToPdf'
Vue.use(htmlToPdf)
4.将下列代码拷贝到htmlToPdf.js文件中
// 导出页面为PDF格式
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'export default {install(Vue) {Vue.prototype.getPdf = function (title, domID) {// 注册getPdf方法,传入两个参数,此处使用了promise处理导出后的操作/*title: 导出文件名domID: 需要导出dom的id或者class*/const dom = document.querySelector(domID);return new Promise((resolve, reject) => {html2Canvas(dom, {useCORS: true, // 由于打印时,会访问dom上的一些图片等资源,解决跨域问题!!重要allowTaint: true // 允许跨域scale: 2, //如果dom区域较大,下载会出现部分灰色区域,需要加scale解决}).then(canvas => {const contentWidth = canvas.widthconst contentHeight = canvas.height// 根据A4纸的大小,计算出dom相应比例的尺寸const pageHeight = contentWidth / 592.28 * 841.89let leftHeight = contentHeightlet position = 0const imgWidth = 595.28// 根据a4比例计算出需要分割的实际dom位置const imgHeight = 592.28 / contentWidth * contentHeight// canvas绘图生成image数据,1.0是质量参数const pageData = canvas.toDataURL('image/jpeg', 1.0)// a4大小const PDF = new JsPDF('', 'pt', 'a4')// 当内容达到a4纸的高度时,分割,将一整块画幅分割出一页页的a4大小,导出pdfif (leftHeight < pageHeight) {PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)} else {while (leftHeight > 0) {PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)leftHeight -= pageHeightposition -= 841.89if (leftHeight > 0) {PDF.addPage()}}}// 导出PDF.save(title + '.pdf')resolve(true)}).catch(() => {reject(false)})})}}
}
6.对应的地方使用
this.getPdf('批阅','.pdf-box');即可下载当前dom的pdf文件

相关内容

热门资讯

透明攻略!新版WPK透明挂内置... 透明攻略!新版WPK透明挂内置教程(透明挂)辅助工具(2022已更新)(哔哩哔哩)准备好在新版WPK...
透明攻略!WPK轻量版透明挂内... 透明攻略!WPK轻量版透明挂内置教程(透明挂)辅助工具(2022已更新)(哔哩哔哩)亲,[WPK轻量...
女演员那尔那茜被曝“高考移民”... 雷佳音主演的《长安的荔枝》,预约人数破了四百万,就在观众们看得火热的时候,出大事了!女主那尔那茜被爆...
透明攻略!智星德州-菠萝透明挂... 你好.智星德州-菠萝这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特...
透明攻略!(GG扑克)透明挂内... 亲,(GG扑克)这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别好...