【问题标题】:Working with jsPDF and html2canvas in a Vuejs project (without webpack)在 Vuejs 项目中使用 jsPDF 和 html2canvas(没有 webpack)
【发布时间】:2019-11-25 22:58:27
【问题描述】:

我正在开发一个 Vuejs 项目中的功能,通过单击一个按钮,用户可以导出一个包含某些 Vuejs 组件的 pdf。一切都很顺利。我 npm 安装了 2 个包,jsPDF 和 html2canvas(这是一个依赖项)。 我将 jsPDF 添加到组件中,如下所示:

import jsPDF from 'jspdf'

点击按钮触发的函数是:

exportpdf() {
    let pdf = new jsPDF('p', 'px', 'a4')
    pdf.addHTML(this.$refs.userinfo, function() {
         pdf.save('web.pdf')
    })
}

点击按钮触发该功能时,出现以下错误:

Uncaught (in promise) Error: You need either https://github.com/niklasvh/html2canvas or https://github.com/cburgmer/rasterizeHTML.js...

所以,我在这里遇到了这个问题: Using jsPDF and html2canvas with es6 解释了 jsPDF 需要 html2canvas 在窗口上。但这只是 Vuejs 中的一个巨大的禁忌(请参阅此处的文章): https://vuejsdevelopers.com/2017/04/22/vue-js-libraries-plugins/

因此,受这篇文章的启发,我将 html2canvas 包添加到 main.js:

import html2canvas from 'html2canvas'
...
Vue.use(html2canvas)

现在,当函数被触发时,我得到了这个:

Uncaught (in promise) Provided element is not within a Document

我也尝试了 document.querySelector('#userinfo') - 结果相同。所以现在我认为自己正式陷入困境 - 非常感谢任何帮助。

【问题讨论】:

    标签: javascript vue.js jspdf html2canvas


    【解决方案1】:

    html2canvas 不是 Vue 插件,所以不能在上面调用 use(...)。

    不过,您可以制作自己的插件。

    import html2canvas from 'html2canvas'
    
    let MyPlugin = {
      install(Vue, options) {
        window.html2canvas = html2canvas
      }
    }
    
    // ...
    Vue.use(MyPlugin)

    如果另一个图书馆需要它,我不确定你为什么反对window.html2canvas = html2canvas

    【讨论】:

    • 好的,我明白,确实,我不能使用它(我是 Vuejs 新手)。但是这里的整个想法是避免将 html2canvas 分配给窗口对象。我看不出这是如何解决问题的,只是它将分配包装在插件中。
    • 您似乎想根据您的示例和外部参考在插件中“封装修复”代码...如果 jsPDF 需要一个全局窗口对象,那么分配它没有任何问题。这根本不是“Vue”问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2019-04-06
    • 2018-10-01
    • 1970-01-01
    相关资源
    最近更新 更多