1、安装
npm install --save html2canvas //html转换成图片
npm install jspdf --save //图片生成pdf
1
2
2、创建一个htmlToPdf.js文件
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
export default {
install(Vue, options) {
reportName 下载时候的标题
Vue.prototype.getPdf = function (reportName) {
return new Promise((resolve, reject) => {
let title = reportName
html2Canvas(document.querySelector('#pdfDom'), {
allowTaint: true,
scale: 2,
height: document.getElementById('pdfDom').scrollHeight,
windowHeight: document.getElementById('pdfDom').scrollHeight + 80
}).then((canvas) => {
let contentWidth = canvas.width * 2
let contentHeight = canvas.height * 2
//一页pdf显示html页面生成的canvas高度;
let pageHeight = contentWidth / 592.28 * 841.89
//未生成pdf的html页面高度
let leftHeight = contentHeight
//页面偏移
let position = 0
//a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
let imgWidth = 595.28
let imgHeight = 592.28 / contentWidth * contentHeight
let pageData = canvas.toDataURL('image/jpeg', 1.0)
let 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(title + '.pdf')
// 删除本地存储的base64字段
let pdfData = PDF.output('datauristring')//获取base64Pdf
resolve(pdfData)
}
)
})
}
}
}
3、在main.js中使用我们封装的htmlToPdf.js
import htmlToPdf from '@/utils/htmlToPdf'
Vue.use(htmlToPdf)
1
2
4、页面中使用
<div class="row" id="pdfDom">
//需要导出的页面部分 定义id为"pdfDom"
</div>
<button @click="downloadPdf()">导出PDF</button>
1
2
3
4
downloadPdf(){
this.downloading = true
//这行代码很重要,它让页面的滚动条跳到了最上方如果点击打印按钮的时候,滚动条没有在最上方,打印内容会是不完整的,体验也会差
window.pageYoffset = 0;
document.documentElement.scrollTop = 0;
document.body.scrollTop = 0;
document.getElementById('pdfDom').scrollTop = 0
this.$nextTick(() => {
setTimeout(() => {
//第二个参数false为不下载,这里调用了刚刚引用的全局函数,.then得到的值是base64位的pdf文件
this.getPdf(this.qualityTitle).then((res) => {
this.downloading = false //下载完成
});
}, 1000);
});
},
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_29050279/article/details/122252508