开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情
Vue实现将页面转成PDF并下载或直接打印
❤ 需要的库
安装Vue页面转为pdf时候所需要的两个库和环境
npm install html2canvas;
npm install jspdf --save
安装之后导入,然后在页面上进行使用
❤ 组件或者页面逻辑
// 导出页面为PDF格式// 导出页面为PDF格式
主要思维:
- 导入页面的组件
- 安装需要使用的函数,调用方法
- 利用canvas将获取到的dom元素的宽高以及分辨率进行修正,按照一定的比列放大缩小以后将其转化为照片(当然,这里是图片的画质和大小越大,所下载下来的文件肯定也越清晰,所下载的文件也越大)。
- 在这个过程之中最重要的尺寸其实就是a4纸,因为我们下载下来的很多pdf格式的东西其实就是打印的。
🌂缺点和不足:
- 首先是页面的裁剪和截断上处理起来特别的麻烦,而且部分地方或者图片没办法完好的智能分割
- 大文件下载时,其实占用的是浏览器的缓存,会导致浏览器直接崩溃
// htmlToPdf.js
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
export default {
install(Vue, options) {
Vue.prototype.getPdf = function () {
var title = this.htmlTitle //DPF标题
html2Canvas(document.querySelector('#pdfDom'), {
allowTaint: true,
taintTest: false,
useCORS: true,
y:72, // 对Y轴进行裁切
// width:1200,
// height:5000,
dpi: window.devicePixelRatio * 4, //将分辨率提高到特定的DPI 提高四倍
scale: 4 //按比例增加分辨率
}).then(function (canvas) {
let contentWidth = canvas.width
let contentHeight = canvas.height
let pageHeight = contentWidth / 592.28 * 841.89
let leftHeight = contentHeight
let position = 0
let imgWidth = 595.28
let imgHeight = 592.28 / contentWidth * contentHeight
let pageData = canvas.toDataURL('image/jpeg', 1.0)
let PDF = new JsPDF('', 'pt', 'a4')
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')
})
}
}
}
❤ 组件或者页面逻辑
// main.js
import htmlToPdf from '@/util/htmlToPdf'
Vue.use(htmlToPdf)