【问题标题】:Angular 8, using jspdf and autotable-jspdf import/usage issuesAngular 8,使用 jspdf 和 autotable-jspdf 导入/使用问题
【发布时间】:2019-09-26 17:06:50
【问题描述】:

Angular 8 - JSPDF & JSPDF-AutoTable

我需要在 html 中导出/生成一个基于一个网格的 pdf,但是需要使用 css 进行一些 DOM 更改,删除一些切换按钮和更改标题等,并且我找到的所有解决方案都像简单的窗口一样打印了一些轻弹。打印()。我也尝试了 pdfmake-wrapper 和 ngx-export-as,但它们没有 autoTable 魔法……最后一个 dom 更改被忽略,除非我使用 Renderer2 DOM 操作……但是我需要一个带有 css 类更改注入且没有 flick 的解决方案,所以我取回了 JSPDF。

我用 npm 安装了 jspdf 和 jspdf-autotable 包。

"dependencies": {
    ...
    "jspdf": "^1.5.3",
    "jspdf-autotable": "^3.2.4",
    ...
}

在 angular-cli.json 文件中,我嵌入了脚本:

"scripts": [ 
        "../node_modules/jspdf/dist/jspdf.min.js",
        "../node_modules/jspdf-autotable/dist/jspdf.plugin.autotable.js"
      ],

在我的 component.ts 文件中,我已将这些文件导入如下:

 import * as jsPDF from 'jspdf'; 
 import * as autoTable from 'jspdf-autotable';

我也尝试过这些行来导入 jspdf-autotable

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

我也尝试过另一种组合。

import jsPDF = require('jspdf');
import { autoTable as AutoTable } from 'jspdf-autotable';

但没有任何效果。

// 在我的 component.ts 文件中,我使用的示例代码如下:

let columns = ["ID", "Name", "Age", "City"];
var data = [
    [1, "Jonatan", 25, "Gothenburg"],
    [2, "Simon", 23, "Gothenburg"],
    [3, "Hanna", 21, "Stockholm"]
];
const doc = new jsPDF(); // or let doc = new jsPDF.default();
doc.autoTable(columns, data);
doc.save("filename");

但是现在当我在调试期间运行 node 命令启动应用程序时,我收到以下错误:

a - 类型“jsPDF”上不存在属性“autoTable”。

b - 错误 TS2339:“typeof jsPDF”类型上不存在属性“default”。

有什么想法吗?

【问题讨论】:

  • 我找到了一个使用 doc.table() here...生成表格的部分解决方案....但是导入 jsPDF 总是返回错误,我试图发送到自动构建服务器,但是返回该错误“默认”。

标签: angular typescript jspdf jspdf-autotable


【解决方案1】:

你必须使用如下。我有一段时间有同样的问题,但是在向开发人员提出问题后,我发现您必须使用 jsPdf() 的实例作为 autoTable() 函数的参数。 Rest 就像 jsdpf 的 documentation 一样。

import { Component, OnInit } from '@angular/core';
import * as jsPDF from 'jspdf';
import autoTable from 'jspdf-autotable';

const doc = new jsPDF();

const columns = [['First Column', 'Second Column', 'Third Column']];
const data = [
['Data 1', 'Data 2', 'Data 3'],
['Data 1', 'Data 2', 'Data 3']
];

 autoTable(doc, {
      head: columns,
      body: data,
      didDrawPage: (dataArg) => { 
       doc.text('PAGE', dataArg.settings.margin.left, 10);
      }
 }); 

doc.save('table.pdf');

示例
源代码
https://codesandbox.io/s/currying-pine-wjp1g?file=/src/app/app.component.ts
现场演示
https://wjp1g.csb.app/

【讨论】:

    【解决方案2】:

    我找到了解决方案,但换了另一个包,PDFMaker

    检查所有documentationsupported browsers

    结帐,有一个很棒的playground 和一个example in Angular 8

    【讨论】:

    • 谢谢。惊人的。它也非常适合我的场景。 jsPDF 在这些错误上浪费了我很多时间。他们的示例,他们在 github 上发布的内容都不起作用。
    【解决方案3】:

    我认为你想做的事情是:

    const jsPDF = require('jspdf');
    

    import jsPDF from 'jspdf';
    

    这假定您的 node_modules 已配置为路径的一部分,但如果您使用的是 CLI,您应该在这里很好。

    【讨论】:

    • 错误...第一个需要节点类型,但是像import jsPDF = require('jspdf');这样导入,第一个和第二个返回错误..."Property 'autoTable'类型 'jsPDF' 上不存在"。
    • 你试过这里的推荐吗:stackoverflow.com/a/41499623/605481
    • 基本上他们导入类型。如果获取类型没有帮助,我会在代码中放置一个断点并查看执行时存在的内容。
    • 我尝试所有可能的组合,并搜索所有可能的示例。 @nephiw我在您共享的链接之前已经检查过,有一个带有角度5的示例....但是,对于像我的情况那样的Angular 8,使用该示例我得到“错误TS2339:属性'默认'不存在输入'typeof jsPDF'。”
    【解决方案4】:

    使用这个例子

    var generateData = function (amount) {
        var result = [];
        var data =
        {
            coin: "100",
            game_group: "GameGroup",
            game_name: "XPTO2",
            game_version: "25",
            machine: "20485861",
            vlt: "0"
        };
        for (var i = 0; i < amount; i += 1) {
            data.id = (i + 1).toString();
            result.push(Object.assign({}, data));
        }
        return result;
    };
    
    function createHeaders(keys) {
        var result = [];
        for (var i = 0; i < keys.length; i += 1) {
            result.push({
            'id' : keys[i],
                'name': keys[i],
                'prompt': keys[i],
                'width': 65,
                'align': 'center',
                'padding': 0
            });
        }
        return result;
    }
    

    输出:

    【讨论】:

    • 感谢反馈,问题是不是如何生成表格...是如何导入jsPDF并用作doc.autoTable(alloptions);... .我们已经在 AngularJS 中使用了 jsPDF,但现在使用 Angular 8,总是返回错误,在我的团队中,我们正在将 AngularJS 迁移到 Angular 8(Typescript),这实际上是所有迁移的最后一个细节。
    【解决方案5】:

    有关问题的正确答案应该是这个。如果将来有人需要,请发布,

    参考 https://github.com/simonbengtsson/jsPDF-AutoTable for autable

    你需要,

    npm install jspdf jspdf-autotable
    

    和 es6,

    import jsPDF from 'jspdf'
    import 'jspdf-autotable'
    
    const doc = new jsPDF()
    doc.autoTable({ html: '#my-table' })
    doc.save('table.pdf')
    

    【讨论】:

    • 它不起作用。我不知道为什么有些人继续推荐这个解决方案。
    【解决方案6】:

    您得到的错误不是因为导入。如果您使用 doc.autoTable 是错误的原因。 以下内容对我有用,并且在官方文档中也给出了。

    import jsPDF from 'jspdf';
    import autoTable from 'jspdf-autotable';  
    
    autoTable(doc, { html: '#report-per-depot',startY: 30, });
    

    对于不同的例子,https://github.com/simonbengtsson/jsPDF-AutoTable/blob/master/examples/examples.js

    参考链接:https://github.com/simonbengtsson/jsPDF-AutoTable#installation

    摘自以上链接:

    您也可以使用导出的 autoTable 方法。这更适用于 typescript 和替代 jsPDF 版本。

     import jsPDF from 'jspdf'
     // import jsPDF = require('jspdf') // // typescript without esModuleInterop flag
     // import jsPDF from 'yworks-pdf' // using yworks fork
     // import jsPDF from 'jspdf/dist/jspdf.node.debug' // for nodejs
     import autoTable from 'jspdf-autotable'
    
     const doc = new jsPDF()
     autoTable(doc, { html: '#my-table' })
     doc.save('table.pdf')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多