JsPDF+html2canvas将网页转换成PDF并解决了图表文字不跨页的问题
基本的思路
给页面内所有要转换成PDF的HTML元素添加一个class="toPDF" 输出的时候,
遍历所有class="toPDF"的HTML元素(注意要保证每个HTML元素的高度都不会超出一页的高度)
将它们逐个加入到pdf文档中,添加的时候如果超出的则添加一页
下面直接上代码
/* eslint-disable */ import html2canvas from 'html2canvas' import JsPDF from 'jspdf' /** * @param ele 要生成 pdf 的DOM元素(容器) * @param padfName PDF文件生成后的文件名字 * */ async function downloadPDF(ele, pdfName) { let eleW = ele.offsetWidth// 获得该容器的宽 let eleH = ele.offsetHeight// 获得该容器的高 let eleOffsetTop = ele.offsetTop // 获得该容器到文档顶部的距离 let eleOffsetLeft = ele.offsetLeft // 获得该容器到文档最左的距离 var canvas = document.createElement('canvas') var abs = 0 let win_in = document.documentElement.clientWidth || document.body.clientWidth // 获得当前可视窗口的宽度(不包含滚动条) let win_out = window.innerWidth // 获得当前窗口的宽度(包含滚动条) if (win_out > win_in) { // abs = (win_o - win_i)/2; // 获得滚动条长度的一半 abs = (win_out - win_in) / 2 // 获得滚动条宽度的一半 // console.log(a, '新abs'); } canvas.width = eleW * 2 // 将画布宽&&高放大两倍 canvas.height = eleH * 2 var context = canvas.getContext('2d') context.scale(2, 2) context.translate(-eleOffsetLeft - abs, -eleOffsetTop) // 这里默认横向没有滚动条的情况,因为offset.left(),有无滚动条的时候存在差值,因此 // translate的时候,要把这个差值去掉 let d = ele.querySelectorAll(".toPDF") console.log(d) var pdf = new JsPDF('', 'pt', 'a4') //页面偏移 let position = 0 let pageHeight = 841.89 for (let i=0; i< d.length; i++){ canvas = await html2canvas(d[i], {dpi: 300, useCORS: true}) console.log(d[i]) var contentWidth = canvas.width var contentHeight = canvas.height var imgWidth = 595.28 var imgHeight = 595.28 / contentWidth * contentHeight var pageData = canvas.toDataURL('image/jpeg', 1.0) if (imgHeight<(pageHeight - position)) { pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight) position = position + imgHeight + 10 }else{ pdf.addPage() position = 0 pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight) } } pdf.save(pdfName) } export { downloadPDF }