jspdf & html2canvas 导出pdf(所见即所得)
- 引入html2canvas
import html2canvas from "html2canvas";
- 引入jsPDF
import jsPDF from "jspdf";
- 分不同状况使用,如下:
一、完全不分页
const container = 要导出的div;
html2canvas(container, {
allowTaint: true,
useCORS: true,
scale: 2,
dpi: "192"
}).then(canvas => {
const { width, height } = canvas;
const url = canvas.toDataURL("image/jpeg", 1.0);
const pdfWidth = (width / 2) * 0.75;
const pdfHeight = (height / 2) * 0.75;
const displayWidth = pdfWidth;
const displayHeight = (height / 2) * 0.75;
const pdf = new jsPDF("", "pt", [pdfWidth, pdfHeight]);
pdf.addImage(url, "jpeg", 0, 0, displayWidth, displayHeight);
pdf.save(`${自定义文件名}.pdf`);
});
二、超过A4纸高度直接分页(为了打印)
const container = 要导出的div;
html2canvas(container, {
allowTaint: true,
useCORS: true,
scale: 2,
dpi: "192"
}).then(canvas => {
const { width, height } = canvas;
const pageHeight = (width / 592.28) * 841.89;
let leftHeight = height;
var position = 0;
const imgWidth = 595.28;
const imgHeight = (592.28 / width) * height;
const pageData = canvas.toDataURL("image/jpeg", 1.0);
const pdf = new jsPDF("", "pt", "a4");
if (leftHeight < pageHeight) {
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(`${this.wish.name}.pdf`);
})
三、超过A4纸高度动态分页
const A4_WIDTH = 595.28;
const A4_HEIGHT = 841.89;
dividePage (dom) {
const pageOffsetTop = dom.offsetTop;
const pageOffsetWidth = dom.offsetWidth;
const unitDoms = dom.querySelectorAll('.minimum-unit');
const perPageHeight = pageOffsetWidth / A4_WIDTH * A4_HEIGHT;
const pages = [
[
{
top: 0,
offsetTop: 0
}
]
]
unitDoms.forEach(item => {
const offsetTop = item.offsetTop - pageOffsetTop;
const top = offsetTop + item.offsetHeight;
const pageIndex = parseInt(top / perPageHeight);
if (!pages[pageIndex]) {
pages[pageIndex] = []
}
pages[pageIndex].push({
top,
offsetTop
})
});
return pages;
}
handleDownload () {
const container = 要导出的div;
const scale = 2;
html2canvas(container, {
allowTaint: true,
useCORS: true,
scale,
dpi: "192"
})
.then(canvas => {
const { width, height } = canvas;
const imgHeight = (A4_WIDTH / width) * height;
const img = new Image();
img.src = canvas.toDataURL("image/png", 1.0);
img.onload = () => {
const pages = this.dividePage(container, height);
const pdf = new jsPDF("", "pt", "a4");
pages.forEach((page, index) => {
const { offsetTop } = page[0];
const { top } = page[page.length - 1];
const previewCanvas = document.createElement('canvas');
previewCanvas.width = width;
previewCanvas.height = height;
const previewCtx = previewCanvas.getContext("2d");
previewCtx.drawImage(img, 0, offsetTop * scale, width, (top - offsetTop) * scale, 0, 0, width, (top - offsetTop) * scale);
previewCtx.putImageData(previewCtx.getImageData(0, 0, width, (top - offsetTop) * scale), 0, 0);
previewCtx.fillStyle = 'rgba(255,255,255,1)';
previewCtx.fillRect(0, (top - offsetTop) * scale, previewCanvas.width, previewCanvas.height - ((top - offsetTop) * scale));
const pageData = previewCanvas.toDataURL("image/jpeg", 1.0);
if (index > 0) {
pdf.addPage()
}
pdf.addImage(pageData, 'JPEG', 0, 0, A4_WIDTH, imgHeight);
})
pdf.save(`${自定义文件名}.pdf`);
}
})
}