4

具有问题 jsPDF 的 Angular 9 模块(已安装的类型 + 包本身)

当做 ng serve 它工作当做 ng build --prod 时,它有错误

ERROR in src/app/xxx/xxxx.componentomponent.ts:52:27 - error TS2351: This expression is not constructable.
  Type 'typeof jsPDF' has no construct signatures.

52       let pdf = new jsPDF('p', 'mm', 'a4');
                             ~~~~~

  src/app/xxx/xxxx.component.ts:7:1
    7 import * as jsPDF from 'jspdf';
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Type originates at this import. A namespace-style import cannot be called or constructed, and will cause a failure at runtime. Consider using a default import or import require here instead.

tsconfig 文件有 "esModuleInterop": true,

{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "downlevelIteration": true,
    "experimentalDecorators": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "importHelpers": true,
    "target": "es2015",
    "allowSyntheticDefaultImports":true,
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2018",
      "dom"
    ]
  },
  "angularCompilerOptions": {
    "fullTemplateTypeCheck": true,
    "strictInjectionParameters": true
  }
}

我像这样导入模块:

**import * as jsPDF from 'jspdf';**

在我的课堂上像这样使用它:

 generatePDF() {
    var data = document.getElementById('contentToConvert');
    html2canvas(data).then(canvas => {
      var imgWidth = 208;
      var imgHeight = canvas.height * imgWidth / canvas.width;
      const contentDataURL = canvas.toDataURL('image/png')
      let pdf = **new jsPDF**('p', 'mm', 'a4');
      var position = 0;
      pdf.addImage(contentDataURL, 'PNG', 0, position, imgWidth, imgHeight)
      pdf.save('skill-set.pdf');
    });
  }

我还尝试在 angular.json 的脚本部分添加模块 js 文件

  "scripts": [
              "node_modules/jquery/dist/jquery.min.js",
              "node_modules/bootstrap/dist/js/bootstrap.min.js",
              **"node_modules/jspdf/dist/jspdf.min.js"**
            ]
4

4 回答 4

17

(在 Angular 10 中测试,所以我猜这个修复程序适用于较新的 Angular 版本)

而不是这个:

import * as jsPDF from 'jspdf';

写这个:

import jspdf from 'jspdf';

[当心!jspdf第二行都是小写字母]

那么你的

let pdf = new jsPDF('p', 'mm', 'a4'); 

也可以,只需将全部更改为小写字母(在执行此操作之前,您必须像我的第二个导入行一样以小写字母导入

let pdf = new jspdf('p', 'mm', 'a4');
于 2020-08-29T13:51:55.107 回答
8

我设置了一个新的 angular 10 项目并且能够使用jspdf.

  1. 创建新的 Angular 应用
> npx @angular/cli new pdf-viewer --strict --defaults true
  1. jspdf从 npm 注册表安装包
> cd pdf-viewer
> npm install jspdf --save
> npm install @types/jspdf --save-dev

在此处输入图像描述

  1. 更新tsconfig.base.jsonallowSyntheticDefaultImports在里面添加compilerOptions
"allowSyntheticDefaultImports": true
  1. 添加一些jspdf代码进行测试src/app/app.component.ts
import { Component, ChangeDetectionStrategy } from '@angular/core';
import jsPDF from 'jspdf';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AppComponent {
  title = 'pdf-viewer';

  constructor() {
    this.generatePDF();
  }

  private generatePDF(): void {
    const doc = new jsPDF();

    doc.text('Hello world!', 10, 10);
    doc.save('a4.pdf');
  }
}
  1. 启动 Angular 应用程序并导航到http://localhost:4200. 您会注意到,a4.pdf一旦我们打开网页,它就会被下载。打开 PDF 文件以验证文件的完整性。
> npm start
于 2020-06-27T22:44:24.387 回答
0

而不是这个:

import * as jsPDF from 'jspdf';

写这个:

import JSPDF from 'jspdf';

那么你的

let pdf = new JSPDF.jsPDF(); 
于 2020-11-06T13:53:28.520 回答
0

像这样导入:

import { jsPDF } from 'jspdf';

// and Initialize JSPDF
var doc = new jsPDF("p", "mm", "a4");

这对我有用。

于 2021-03-21T16:43:46.613 回答