import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
const getPdf = async(dom, title) => {
//将base64转换为文件对象
function dataURLtoFile(dataurl, filename) {
var arr = dataurl.split(',');
var mime = arr[0].match(/:(.*?);/)[1];
var bstr = atob(arr[1]);
var n = bstr.length;
var u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
//转换成file对象
return new File([u8arr], filename, { type: mime });
//转换成成blob对象
//return new Blob([u8arr],{type:mime});
}
await new Promise((resolve, reject) => {
try {
// 避免模糊,放大倍数,倍数可调整
const el = document.getElementById(dom) || document.querySelector(dom)
var c = document.createElement('canvas')
var opts = {
scale: 3,
canvas: c,
allowTaint: false,
logging: true,
useCORS: true,
width: window.getComputedStyle(el).width.replace('px', '') * 1,
height: window.getComputedStyle(el).height.replace('px', '') * 1
}
c.width = window.getComputedStyle(el).width.replace('px', '') * 3
c.height = window.getComputedStyle(el).height.replace('px', '') * 3
c.getContext('2d').scale(1, 1)
html2Canvas(el, opts).then(async canvas => {
const contentWidth = canvas.width
const contentHeight = canvas.height
const pageHeight = (contentWidth / 592.28) * 1200.89
let leftHeight = contentHeight
let position = 0
const imgWidth = 590.28
const imgHeight = (550.28 / contentWidth) * contentHeight
const pageData = await canvas.toDataURL('image/jpeg', 1.0)
const PDF = await new JsPDF('', 'pt', 'a4')
if (leftHeight < pageHeight) {
await PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
} else {
while (leftHeight > 0) {
await PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
leftHeight -= pageHeight
position -= 841.89
if (leftHeight > 0) {
await PDF.addPage()
}
}
}
var buffer = PDF.output('dataurlstring');
var base64 = buffer.split("base64,")[1];
await PDF.save(title + '.pdf')
resolve()
// location.reload()
})
} catch (error) {
reject(error)
}
})
}
export default getPdf
代码贴上,效果是点击按钮查找dom元素进行PDF生成并下载,title即是PDF文件名;问题来了,页面内容转PDF是正常无误的,但是有些时候生成出来的PDF会上边留白,下边截取不全,思考一番后觉得是PDF生成的高度导致的,调试了一下imgHeight后测试生成还是会有概率出现这问题。
想了很久没解决办法,直接百度一下,结果就是个很简单的问题,使用html2canvas时,页面必须在保持在最左上角,这样导出来的PDF整个模板才不会变形。
然后我用原生js一试,果然成功了,无论怎么生成都不会出现上边留白下边截取不全的情况。
//回到页面顶部
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;