《vue生成pdf封装 精进版》

为什么会想封装呢?首先上一篇文章我们是直接把getPdf给挂载到Vue实例上,这种写法一般都是这就在main.js中去写,这样当我们挂载得越来越多的方法的时候,我们的main.js就会变得特别乱。这时候vue.use()的妙用就出来了,我们以前经常使用的element,antd这些组件,全局引入的时候都是用的vue.use去注册,这里我们也可以把getPdf这个方法抽离出去,然后使用vue.use来注册,也就是全局挂载,这样我们那一堆代码就可以抽离出去了。
接下来让我们看看怎么抽离吧。
其实也非常简单,只需要把Vue.prototype.getPdf这个方法包装到一个install函数里面,因为vue.use执行你给的就是导出对象中的install函数 文件htmlToPdf.js
所以代码如下:

// 导出页面为PDF格式
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'

export default {
    install(Vue) {
        Vue.prototype.getPdf = function (title, dom, emptyDomId) {
            // 注册getPdf方法,传入两个参数,此处使用了promise处理导出后的操作
            /*
            title: 导出文件名
            dom: 需要导出dom的id
             */
            return new Promise((resolve, reject) => {
                html2Canvas(dom, {
                    useCORS: true, // 由于打印时,会访问dom上的一些图片等资源,解决跨域问题!!重要
                    allowTaint: true // 允许跨域
                }).then(canvas => {
                    const contentWidth = canvas.width
                    const contentHeight = canvas.height
                    // 根据A4纸的大小,计算出dom相应比例的尺寸
                    const pageHeight = contentWidth / 592.28 * 841.89
                    let leftHeight = contentHeight
                    let position = 0
                    const imgWidth = 595.28
                    // 根据a4比例计算出需要分割的实际dom位置
                    const imgHeight = 592.28 / contentWidth * contentHeight
                    // canvas绘图生成image数据,1.0是质量参数
                    const pageData = canvas.toDataURL('image/jpeg', 1.0)
                    // a4大小
                    const PDF = new JsPDF('', 'pt', 'a4')
                    // 当内容达到a4纸的高度时,分割,将一整块画幅分割出一页页的a4大小,导出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')
                    // 删除添加的空div

                    const emptyDom = document.getElementById(emptyDomId)
                    emptyDom.remove()
                    resolve(true)
                })
                    .catch(() => {
                        reject(false)
                    })
            })
        }
    }
}

包装好剩下就是使用了,使用就更简单了.
我们只需要在main.js中引入,然后使用Vue.use注册一下可以了,直接抽离了几十行代码,main.js都整洁了

import htmlToPdf from '@/utils/pdf/htmlToPdf'
Vue.use(htmlToPdf)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值