vue下载图片:利用html2canvas 下载图片
1、先npm install html2canvas jspdf --save 2、给包裹的外层标签写上id选择器后,根据选择器获取元素 完整代码示例:
<div>
<div id="table">
<div class="table-d">
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="date" label="日期" width="180">
</el-table-column>
<el-table-column prop="name" label="姓名" width="180">
</el-table-column>
<el-table-column prop="address" label="地址"> </el-table-column>
</el-table>
</div>
</div>
<div style="text-align: right; margin-top: 5px">
<el-button type="primary" @click="downloadResult(title)">
点击下载
</el-button>
<el-button type="primary" @click="handleCancel">取消</el-button>
</div>
</div>
</template>
<script>
import html2canvas from "html2canvas";
export default {
data() {
return {
tableData: [
{
date: "2016-05-02",
name: "王小虎",
address: "上海市普陀区金沙江路 1518 弄",
},
{
date: "2016-05-04",
name: "王小虎",
address: "上海市普陀区金沙江路 1517 弄",
},
{
date: "2016-05-01",
name: "王小虎",
address: "上海市普陀区金沙江路 1519 弄",
},
{
date: "2016-05-03",
name: "王小虎",
address: "上海市普陀区金沙江路 1516 弄",
},
],
title: "",
};
},
methods: {
handleClick(tab, event) {
console.log(tab, event);
},
// 取消
handleCancel() {
},
down(target, name) {
downPdf(target, name);
},
dataURLToBlob(dataurl) {
//ie 图片转格式
var arr = dataurl.split(","),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], { type: mime });
},
downloadResult(name) {
let canvasID = document.querySelector("#table");
let a = document.createElement("a");
html2canvas(canvasID).then((canvas) => {
let dom = document.body.appendChild(canvas);
dom.style.display = "none";
a.style.display = "none";
document.body.removeChild(dom);
let blob = this.dataURLToBlob(dom.toDataURL("image/pdf"));
a.setAttribute("href", URL.createObjectURL(blob));
a.setAttribute("download", name + ".pdf");
document.body.appendChild(a);
a.click();
URL.revokeObjectURL(blob);
document.body.removeChild(a);
});
},
},
};
</script>
<style >
</style>`
vue下载pdf:利用html2canvas 下载pdf
import html2canvas from "html2canvas";
import JsPDF from 'jspdf'
export default {
data() {
return {
tableData: [
{
date: "2016-05-02",
name: "王小虎",
address: "上海市普陀区金沙江路 1518 弄",
},
{
date: "2016-05-04",
name: "王小虎",
address: "上海市普陀区金沙江路 1517 弄",
},
{
date: "2016-05-01",
name: "王小虎",
address: "上海市普陀区金沙江路 1519 弄",
},
{
date: "2016-05-03",
name: "王小虎",
address: "上海市普陀区金沙江路 1516 弄",
},
],
title: "",
};
},
methods: {
handleClick(tab, event) {
console.log(tab, event);
},
// 取消
handleCancel() {
},
down(target, name) {
downPdf(target, name);
},
dataURLToBlob(dataurl) {
//ie 图片转格式
var arr = dataurl.split(","),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], { type: mime });
},
downloadResult(name) {
let canvasID = document.querySelector("#table");
let a = document.createElement("a");
html2canvas(canvasID).then((canvas) => {
var contentWidth = canvas.width;
var contentHeight = canvas.height;
//一页pdf显示html页面生成的canvas高度;
var pageHeight = contentWidth / 592.28 * 841.89;
//未生成pdf的html页面高度
var leftHeight = contentHeight;
//页面偏移
var position = 0;
//a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
var imgWidth = 595.28 - 40;
// a4w = 190, a4h = 277; //A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277
// Math.floor(a4h * canvas.width / a4w),
var imgHeight = 595.28 / contentWidth * contentHeight;
var pageData = canvas.toDataURL('image/jpeg', 1.0);
var pdf = new JsPDF('p', 'pt', 'a4');
//有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
//当内容未超过pdf一页显示的范围,无需分页
if (leftHeight < pageHeight) {
//在pdf.addImage(pageData, 'JPEG', 左,上,宽度,高度)设置在pdf中显示;
pdf.addImage(pageData, 'JPEG', 20, 20, imgWidth, imgHeight);
// pdf.addImage(pageData, 'JPEG', 20, 40, imgWidth, imgHeight);
} else { // 分页
while (leftHeight > 0) {
pdf.addImage(pageData, 'JPEG', 20, position, imgWidth, imgHeight);
leftHeight -= pageHeight;
position -= 841.89;
//避免添加空白页
if (leftHeight > 0) {
pdf.addPage();
}
}
}
//可动态生成
pdf.save('111');
});
},
},
};
</script>
第一次写,有什么不足之处,请各位大佬指出,目前是可以实现所需要的功能