不分页代码,解决分页导致表或图显示不全
handleDownloadPDF = () => {
const { startTime, endTime, type } = this.state;
document.body.style.overflow = 'hidden'
document.getElementById('reportBox').style.backgroundColor = '#FFFFFF';
setTimeout(() => {
const element = document.getElementById('reportBox'); // 这个dom元素是要导出pdf的div容器
var width = element.offsetWidth; //dom宽
var height = element.offsetHeight; //dom高
var scale = 2; //放大倍数
var opts = {
dpi: window.devicePixelRatio * 2,
scale: scale,
width: width,
height: height,
useCORS: true // 如果截图的内容里有图片,可能会有跨域的情况,加上这个参数,解决文件跨域问题
};
html2canvas(element, opts).then((canvas) => {
var contentWidth = canvas.width;
var contentHeight = canvas.height;
var pdfWidth = (contentWidth + 10) / 2 * 0.75;
var pdfHeight = (contentHeight + 200) / 2 * 0.75; // 500为底部留白
var imgWidth = pdfWidth;
var imgHeight = (contentHeight / 2 * 0.75); //内容图片这里不需要留白的距离
var pageData = canvas.toDataURL('image/jpeg', 1.0);
var pdf = new jsPDF('', 'pt', [pdfWidth, pdfHeight]);
pdf.addImage(pageData, 'jpeg', 0, 0, imgWidth, imgHeight);
pdf.save(`江苏省大数据管理中心数据质量${type === 0 ? '周报' : type === 1 ? '月报' : type === 2 ? '年报' : '报告'}(${startTime}~${endTime}).pdf`);
element.style.backgroundColor = 'transparent';
document.body.style.overflow = 'visible';
});
}, 3000)
};
下载pdf分页代码
handleDownloadPDF = () => {
const { startTime, endTime, type } = this.state;
document.body.style.overflow = 'hidden'
document.getElementById('reportBox').style.backgroundColor = '#FFFFFF';
setTimeout(() => {
const element = document.getElementById('reportBox'); // 这个dom元素是要导出pdf的div容器
const w = element.offsetWidth; // 获得该容器的宽
const h = element.offsetWidth; // 获得该容器的高
const { offsetTop } = element; // 获得该容器到文档顶部的距离
const { offsetLeft } = element; // 获得该容器到文档最左的距离
const canvas = document.createElement('canvas');
let abs = 0;
const win_i = document.body.clientWidth; // 获得当前可视窗口的宽度(不包含滚动条)
const win_o = window.innerWidth; // 获得当前窗口的宽度(包含滚动条)
if (win_o > win_i) {
abs = (win_o - win_i) / 2; // 获得滚动条长度的一半
}
canvas.width = w * 2; // 将画布宽&&高放大两倍
canvas.height = h * 2;
const context = canvas.getContext('2d');
context.scale(2, 2);
context.translate(-offsetLeft - abs, -offsetTop);
// 这里默认横向没有滚动条的情况,因为offset.left(),有无滚动条的时候存在差值,因此
// translate的时候,要把这个差值去掉
html2canvas(element, {
allowTaint: true,
scale: 2 // 提升画面质量,但是会增加文件大小
}).then((canvas) => {
const contentWidth = canvas.width;
const contentHeight = canvas.height;
// 一页pdf显示html页面生成的canvas高度;
const pageHeight = contentWidth / 595.28 * 841.89;
// 未生成pdf的html页面高度
let leftHeight = contentHeight;
// 页面偏移
let position = 0;
// a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
const imgWidth = 595.28;
const imgHeight = 595.28 / contentWidth * contentHeight;
const pageData = canvas.toDataURL('image/jpeg', 1.0);
const 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();
}
}
}
pdf.save(`江苏省大数据管理中心数据质量${type === 0 ? '周报' : type === 1 ? '月报' : type === 2 ? '年报' : '报告'}(${startTime}~${endTime}).pdf`);
element.style.backgroundColor = 'transparent';
document.body.style.overflow = 'visible';
});
}, 3000)
};
本人项目中的应用,只要传入id值,自定义生产pdf。
//此函数为本人项目中的应用,面对不同项目进行修改。
handleDownloadPDF = () => {
const pdf = new jsPDF('', 'pt', 'a4');
let flag = false
let page = 1
document.body.style.overflow = 'hidden'
document.getElementById('reportBox').style.backgroundColor = '#FFFFFF';
document.getElementById("mapEcharts").style.marginTop = "500px";
document.getElementById("getScore").style.marginTop = "150px";
this.DownPDF(document.getElementById('top1'), flag, pdf,page)
//由于echart2元素根据后台请求生成,所以做此判断,如果存在,即生成pdf。如果不存在则不生成pdf。
if (document.getElementById("echart2") !== null) {
document.getElementById("echart2").style.marginTop = "150px";
this.DownPDF(document.getElementById('top2'), flag, pdf,page)
document.getElementById("echart2").style.marginTop = "0";
} else if (document.getElementById("echart2") === null) {
this.DownPDF(document.getElementById('top2'), flag, pdf,page)
}
flag = true
page = 2
this.DownPDF(document.getElementById('top3'), flag, pdf,page)
document.getElementById("mapEcharts").style.marginTop = "20px";
document.getElementById("getScore").style.marginTop = "0";
};
//封装下载pdf函数,传入多个节点元素进行拼接pdf。
DownPDF = (element, flag, pdf, page) => {
const { startTime, endTime, type } = this.state;
const w = element.offsetWidth; // 获得该容器的宽
const h = element.offsetWidth; // 获得该容器的高
const { offsetTop } = element; // 获得该容器到文档顶部的距离
const { offsetLeft } = element; // 获得该容器到文档最左的距离
const canvas = document.createElement('canvas');
let abs = 0;
const win_i = document.body.clientWidth; // 获得当前可视窗口的宽度(不包含滚动条)
const win_o = window.innerWidth; // 获得当前窗口的宽度(包含滚动条)
if (win_o > win_i) {
abs = (win_o - win_i) / 2; // 获得滚动条长度的一半
}
canvas.width = w * 2; // 将画布宽&&高放大两倍
canvas.height = h * 2;
const context = canvas.getContext('2d');
context.scale(2, 2);
context.translate(-offsetLeft - abs, -offsetTop);
// 这里默认横向没有滚动条的情况,因为offset.left(),有无滚动条的时候存在差值,因此
// translate的时候,要把这个差值去掉
html2canvas(element, {
allowTaint: true,
scale: 2 // 提升画面质量,但是会增加文件大小
}).then((canvas) => {
const contentWidth = canvas.width;
const contentHeight = canvas.height;
// 一页pdf显示html页面生成的canvas高度;
let pageHeight = contentWidth / 595.28 * 841.89;
// 未生成pdf的html页面高度
let leftHeight = contentHeight;
// 页面偏移
let position = 0;
// a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
const imgWidth = 595.28;
const imgHeight = 595.28 / contentWidth * contentHeight;
const pageData = canvas.toDataURL('image/jpeg', 1.0);
// 有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
// 当内容未超过pdf一页显示的范围,无需分页
if (document.getElementById("echart2") === null){
pageHeight=3570
}
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();
}
}
if (page===1) {
pdf.addPage();
}
}
if (flag) {
pdf.save(`江苏省大数据管理中心数据质量${type === 0 ? '周报' : type === 1 ? '月报' : type === 2 ? '年报' : '报告'}(${startTime}~${endTime}).pdf`);
element.style.backgroundColor = 'transparent';
document.body.style.overflow = 'visible';
}
});
}