html2Canvas + pdfjs 将页面dom元素导出为pdf
当页面元素很少时,页面可以正常导出,但页面内容过多时,导出的pdf全部变成黑色内容
function uploadPdf($vue, domName){
document.documentElement.scrollTop = 0;
document.documentElement.scrollLeft = 0;
document.body.scrollTop = 0;
document.body.scrollLeft = 0;
let imageWrapper = document.querySelector("#"+domName)
$vue.$nextTick(() => {
html2Canvas(imageWrapper, {
allowTaint: true,
x: imageWrapper.getBoundingClientRect().left - 180 ,
y:imageWrapper.getBoundingClientRect().top,
width:imageWrapper.offsetWidth - 15,
height:imageWrapper.offsetHeight,
backgroundColor:"#FFF",
useCORS: true,
scale:3,
dpi: 350,
}).then((canvas) => {
let pdf = new JsPDF('p', 'mm', 'a4');
let ctx = canvas.getContext('2d'),
a4w = 190, a4h = 277,
imgHeight = Math.floor(a4h * canvas.width / a4w),
renderedHeight = 0;
while(renderedHeight < canvas.height) {
let page = document.createElement("canvas");
page.width = canvas.width;
page.height = Math.min(imgHeight, canvas.height - renderedHeight);
page.getContext('2d').putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0);
pdf.addImage(page.toDataURL('image/jpeg', 0.2), 'JPEG', 10, 10, a4w, Math.min(a4h, a4w * page.height / page.width));
renderedHeight += imgHeight;
if(renderedHeight < canvas.height)
pdf.addPage();
let uploadPdf = pdf.output("datauristring")
let arr = uploadPdf.split(',')
let mime = arr[0].match(/:(.*?);/)[1]
let suffix = mime.split('/')[1]
let bstr = window.atob(arr[1])
let n = bstr.length
let u8arr = new Uint8Array(n)
let filename="temp_img";
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
let file = new File([u8arr], `${filename}.${suffix}`, {type: mime});
let formdata = new FormData();
formdata.append("uploadfile",file);
}
pdf.save("导出pdf");
})
})
}