【问题标题】:I cannot use jsPDF with Angular 10我不能在 Angular 10 中使用 jsPDF
【发布时间】:2020-08-31 09:06:42
【问题描述】:

我试图使用jspdf 库打印我的页面。我已经尝试了很多解决方案来完成这里的示例以及几乎每个 Google 建议链接,但我仍然无法修复它。

这是我迄今为止尝试过的:

import * as jsPDF from 'jspdf';
.....
openPDF(): void {
    const DATA = this.couponPage.nativeElement;
    const doc = new jsPDF('p', 'pt', 'a4');
    doc.fromHTML(DATA.innerHTML, 15, 15);
    doc.output('dataurlnewwindow');
}

尝试像上面那样导入jsPDF会在编译时产生以下错误

src/...component.ts:42:21 中的错误 - 错误 TS2351:此表达式不可构造。 类型 'typeof import("jspdf")' 没有构造签名。

42     const doc = new jsPDF('p', 'pt', 'a4');

所以,我尝试按照stackoverflow answer 中的建议以另一种方式导入它

declare var jsPDF: any;

但这会产生一个控制台错误,指出 jsPDF 未定义。

然后我找到了另一个解决方案,发布在此处Angular 10/9/8 PDF Tutorial – Export PDF in Angular with JSPDF

现在按照这个方法我得到了以下错误

ERROR TypeError: doc.fromHTML is not a function openPDF notice.component.ts:43 ...Component_Template_button_click_2_listener ...component.html:3 角 23

我不知道我在这里错过了什么,因为这个库应该适用于所有 Angular 版本。任何帮助将不胜感激。

在这里我创建了一个Stackblitz project

【问题讨论】:

  • 你可以参考这里的 Stackblitz 如何导入 jsPDF: stackblitz.com/edit/jspdf-fpmqwp
  • 您是否在 angular.json 的脚本中添加了 "./node_modules/jspdf/dist/jspdf.min.js", ?否则declare var...不会成功
  • @CharybdeBE 是的,我确实包含在angular.json
  • @MichaelD 它不工作仍然抛出doc.fromHTML is not a function的控制台错误

标签: angular jspdf


【解决方案1】:

在为这个问题尝试了这么多不同的解决方案之后,我发现addHTMLfromHTML 在最新版本的jspdf 中都被贬低了,它们被替换为html。对于那些正在寻找更好的解决方案来使用jspdfAngular 10 的人来说,这是我目前发现的看起来有效的方法和更好的结果。

要导入 jspdf 版本 (2.x.x),只需执行以下操作:import { jsPDF } from 'jspdf';

您不需要像在以前的版本中那样将任何依赖项包含到angular.json 脚本中。如果您在index.html 内添加jspdfhtml2canvas 的脚本,也将它们删除。通过运行npm install jspdf,它还会安装html2canvas,它也是由jspdf动态导入的。

import { Component, OnInit, ViewChild, ElementRef } from '@angular/core';
import { jsPDF } from 'jspdf';

.....

 @ViewChild('couponPage', { static: true }) couponPage: ElementRef;

.......

openPDF(): void {
  const DATA = this.couponPage.nativeElement;
  const doc: jsPDF = new jsPDF("p", "mm", "a4");
  doc.html(DATA, {
     callback: (doc) => {
       doc.output("dataurlnewwindow");
     }
  });
}

虽然我仍然使用doc.html() 方法,但它不会使用 css 用于我的页面的样式。

【讨论】:

  • 当我按照你解释的方式尝试时,我得到了 core.js:6162 ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'createElement' of undefined TypeError: Cannot read property 'createElement' of undefined 。你在你的实现中看到这个错误了吗?
【解决方案2】:

在 stackblitz 上与 OP 合作了一小段时间后,似乎主要问题是库的使用在版本 1.3.5(示例中使用的版本)到 2.1.0(他的版本)之间发生了变化正在使用)。我正在添加这个答案,以便它可以为未来遇到类似问题的解决方案寻求者提供线索。

【讨论】:

    【解决方案3】:

    代替你使用的导入指令,试试

    import jsPDF from 'jspdf';
    

    请注意,如果您使用此方法,则必须删除

    declare var jsPDF:any;
    

    【讨论】:

    • 当您使用特定的导入指令时收到的错误信息是什么?
    • 当我使用declare 方法时,它说jsPDF 在编译时没有定义。当我按照您的回答导入它时,我在浏览器控制台中收到doc.fromHTML is not a function 错误。
    • 因此切换导入语句将问题从编译时转移到运行时。你确定你删除了声明语句?另外,您用来实例化 doc 变量的行是什么? (包含 doc=new jsPDF(....) 的那个)
    • 是的,我很确定我在导入 jspdf 时删除了声明语句。这就是我实例化文档变量const doc = new jsPDF('p', 'pt', 'a4'); 的方式我不知道我在这里做错了什么。
    • 在 jsPDF 文档中,这不是他们使用构造函数的方式。试试 let doc=new jsPDF();看看错误是否改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多