这个方法是先把dom转成图片塞进pdf里面,最后导出。
缺陷
- 前端获取的data显示不灵活;
- 页面太长会损耗性能
首先需要安装html2canvans和jspdf
downloadPDF.js
import html2canvas from 'html2canvas';
import JsPDF from 'jspdf';
/**
* @param el
* @param padfName PDF文件生成后的文件名字
* */
function downloadPDF(el, pdfName){
let eleW = el.offsetWidth;// 获得该容器的宽
let eleH = el.offsetHeight;// 获得该容器的高
let eleOffsetTop = el.offsetTop; // 获得该容器到文档顶部的距离
let eleOffsetLeft = el.offsetLeft; // 获得该容器到文档最左的距离
var canvas = document.createElement("canvas");
var abs = 0;
let win_in = document.documentElement.clientWidth || document.body.clientWidth; // 获得当前可视窗口的宽度(不包含滚动条)
let win_out = window.innerWidth; // 获得当前窗口的宽度(包含滚动条)
if(win_out>win_in){
abs = (win_out - win_in)/2; // 获得滚动条宽度的一半
}
canvas.width = eleW * 2; // 将画布宽&&高放大两倍
canvas.height = eleH * 2;
var context = canvas.getContext("2d");
context.scale(2, 2);
context.translate(-eleOffsetLeft -abs, -eleOffsetTop);
html2canvas(el, {
allowTaint: true,
dpi: 96, //分辨率
scale: 2, //设置缩放
useCORS:true, //允许canvas画布内 可以跨域请求外部链接图片, 允许跨域请求。,
//backgroundColor:'#ffffff',这样背景还是黑的
bgcolor :'#ffffff',//应该这样写
logging:false //打印日志用的 可以不加默认为false
} ).then( (canvas)=>{
let contentWidth = canvas.width;
let contentHeight = canvas.height;
// 一页pdf显示html页面生成的canvas高度;
let pageHeight = contentWidth / 841.89 * 592.28;
// 未生成pdf的html页面高度
let leftHeight = contentHeight;
// 页面偏移
let position = 0;
// html页面生成的canvas在pdf中图片的宽高(本例为:横向a4纸[841.89,592.28],纵向需调换尺寸)
let imgWidth = 841.89;
let imgHeight = 841.89 / contentWidth * contentHeight;
let pageData = canvas.toDataURL('image/jpeg', 1.0);
let PDF = new JsPDF('l', 'pt', 'a4');
// 两个高度需要区分: 一个是html页面的实际高度,和生成pdf的页面高度
// 当内容未超过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 -= 582.28;
// 避免添加空白页
if (leftHeight > 0) {
PDF.addPage();
}
}
}
PDF.save(pdfName + '.pdf')
})
}
export default {
downloadPDF
}
//外部调用
import htmlToPdf from '@/vendor/htmlToPdf'
htmlToPdf.downloadPDF(this.$refs.exportPdfId, '谈判报告')