使用 angular2/typescript 从 html 生成 PDF 文件

Posted

技术标签:

【中文标题】使用 angular2/typescript 从 html 生成 PDF 文件【英文标题】:Generate PDF file from html using angular2/typescript 【发布时间】:2016-12-24 02:18:45 【问题描述】:

我想提取我的 html 模板的一部分并将其转换为 PDF 文件,以便用户可以选择下载它。 (例如,在他们单击按钮之后)。

我找到了一个名为 jsPDF 的库,我将如何在 Angular2 应用程序 (RC4) 中使用 jsPDF?

谢谢

【问题讨论】:

【参考方案1】:

为什么使用定义(也称为声明)文件?

要将外部 javascript 库(例如 jsPDF)与 Angular2 应用程序(使用 Typescript)一起使用,您将需要这些 javascript 库的类型定义文件。这些文件向 typescript 提供类型信息(如StringNumberboolean 等)以帮助编译时类型检查。 (因为 javascript 的类型很松散)

关于 d.ts 文件的另一种解释可以找到here。

如何使用

您可以下载一个名为 typings 的 npm 包,这将有助于加快进程。 Here's 关于如何使用它的简短指南。一旦你安装了类型,你可以运行:

npm run -- typings install dt~jspdf --global --save

获取可以在项目中使用的类型文件。

【讨论】:

嘿 Scrambo,我完全做到了这一点。但由于某种原因,它不能专门用于 jspdf(我之前已经做过了)。我能注意到的原因是,由于某种原因,import 语句试图从 node_modules 依赖项中获取模块,而不是从全局类型中声明的 index.d.t 中获取模块。然后我得到消息(在浏览器控制台中):错误:TypeError:AMD模块localhost:5555/node_modules/jspdf/dist/jspdf.min.js没有定义(...)【参考方案2】:

如果您想在生产中使用它,您绝对不想依赖 index.html 中引用的互联网链接,就像 @khalil_diouri 建议的那样。

所以,要在 Angular2/Typescript 环境中正确使用它, 首先从 npm 安装它

npm install --save jspdf

如果您使用 SystemJS,请将其映射到您的配置文件中

map: 
    "jspdf": "node_modules/jspdf/dist/jspdf.min.js"

安装定义包:(如果未安装)

npm install typings --global

安装定义文件:

typings install dt~jspdf --global --save

最后,将它导入到您的 component.ts 文件中

import jsPDF from 'jspdf'
...
    let doc = new jsPDF();
    doc.text(20,20,'Hello world');
    doc.save('Test.pdf');
...

【讨论】:

我觉得在angular中我应该可以使用组件模板。有没有一种简单的方法可以将已经构建和样式化的模板转换为 jsPDF 方法? 我最终使用了这个...查看源代码:cdn.rawgit.com/MrRio/jsPDF/master/examples/html2pdf/…【参考方案3】:

AddHtml 方法已弃用:

来源: 插件/addhtml.js,第 12 行 已弃用: 这将替换为支持矢量的 API。 see here

将 HTML 元素渲染到添加到 PDF 中的画布对象

此功能需要html2canvas 或rasterizeHTML

【讨论】:

【参考方案4】:

作为回应

此链接是导入jsPDF内容所必需的

<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.0.272/jspdf.debug.js"></script> // to use jsPDF for registring pdf file

然后在你的component.ts中

你这样做

declare let jsPDF;

@Component(
    template: `
        <button
          (click)="download()">download
        </button>
        `
)

export class DocSection 


    constructor() 
    

    public download() 

        var doc = new jsPDF();
        doc.text(20, 20, 'Hello world!');
        doc.text(20, 30, 'This is client-side Javascript, pumping out a PDF.');
        doc.addPage();
        doc.text(20, 20, 'Do you like that?');

        // Save the PDF
        doc.save('Test.pdf');
    


【讨论】:

以上是关于使用 angular2/typescript 从 html 生成 PDF 文件的主要内容,如果未能解决你的问题,请参考以下文章

Angular2 + typescript + jspm:没有 Http 提供者( App -> Provider -> Http )

angular2 Typescript中的Jquery不起作用

Angular2 + Typescript + FileReader.onLoad = 属性不存在

Angular 2、TypeScript 和 ui-router - 如何获取状态参数

如何将 jQuery 导入 Angular2 TypeScript 项目?

降级使用 Typescript 编写的 angular2 组件。如何将其导入用 es5 编写的 angular 1 项目?