function exportPDF(container, fileName) {
var pdfDom = $(container);
var w = pdfDom.width(); // 获得该容器的宽
var h = pdfDom.height(); // 获得该容器的高
var offsetTop = pdfDom.offset().top; // 获得该容器到文档顶部的距离
var offsetLeft = pdfDom.offset().left; // 获得该容器到文档最左的距离
var canvas = document.createElement('canvas');
var abs = 0;
var win_i = $(window).width(); // 获得当前可视窗口的宽度(不包含滚动条)
var win_o = window.innerWidth; // 获得当前窗口的宽度(包含滚动条)
if (win_o > win_i) {
abs = (win_o - win_i) / 2; // 获得滚动条长度的一半
}
canvas.width = w * 4; // 将画布宽&&高放大4倍
canvas.height = h * 4;
var context = canvas.getContext('2d');
context.scale(4, 4);
context.translate(-offsetLeft - abs, -offsetTop);
// 这里默认横向没有滚动条的情况,因为offset.left(),有无滚动条的时候存在差值,因此
// translate的时候,要把这个差值去掉
html2canvas(pdfDom, {
allowTaint: true,
taintTest: true,
canvas: canvas,
dpi: 172, // 导出pdf清晰度
onrendered: function(canvas) {
// 开始canvas截图
// 开始准备工作
var contentWidth = canvas.width;
var contentHeight = canvas.height;
// 一页pdf显示html页面生成的canvas高度;
var pageHeight = contentWidth / 595.28 * 841.89;
// 未生成pdf的html页面高度
var leftHeight = contentHeight;
// pdf页面偏移
var position = 0;
// a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
var imgWidth = 555.28;
var imgHeight = 555.28 / contentWidth * contentHeight;
var pageData = canvas.toDataURL('image/jpeg', 1.0);
var pdf = new jsPDF('', 'pt', 'a4');
// 有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
// 当内容未超过pdf一页显示的范围,无需分页
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();
}
}
}
let date = new Date()
let year = date.getFullYear() + ''
let month = date.getMonth() + 1 >= 10 ? date.getMonth() + 1 + '' : '0' + (date.getMonth() + 1)
let day = date.getDate() >= 10 ? date.getDate() + '' : '0' + date.getDate()
let hh = date.getHours() >= 10 ? date.getHours() + '' : '0' + date.getHours()
let mm = date.getMinutes() >= 10 ? date.getMinutes() + '' : '0' + date.getMinutes()
let ss = date.getSeconds() >= 10 ? date.getSeconds() + '' : '0' + date.getSeconds()
let time = year + month + day + hh + mm + ss;
pdf.save(fileName + time + '.pdf');
}
});
};
用法
// html
<div class="export-container">
展示内容
</div>
// js
exportPDF('.export-container', '活动量');