Angular2:如何使用pdfmake库

时间:2017-07-17 04:44:49

标签: angular pdfmake

尝试在我的Angular 2(version = 4.2.x)项目中使用客户端pdf库pdfmake

在.angular-cli.json文件中,我声明了这样的js:

"scripts": [
    "../node_modules/pdfmake/build/pdfmake.js",
    "../node_modules/pdfmake/build/vfs_fonts.js"
  ]

然后在app.component.ts中,我像这样使用它:

import * as pdfMake from 'pdfmake';

@Component({
selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
   pdf: any;
   downloadPdf() {
    let item = {firstName: 'Peter', lastName: 'Parker'};
    this.pdf = pdfMake;
    this.pdf.createPdf(buildPdf(item)).open();
  }
}

function buildPdf(value) {
   var pdfContent = value;
   var docDefinition = {
     content: [{
    text: 'My name is: ' + pdfContent.firstName  + ' ' + pdfContent.lastName + '.'
     }]
   }
   console.log(pdfContent);
   return docDefinition;
}

加载应用时,我在浏览器控制台中遇到以下错误:

Uncaught TypeError: fs.readFileSync is not a function
at Object.<anonymous> (linebreaker.js:15)
at Object.<anonymous> (linebreaker.js:161)
at Object.../../../../linebreak/src/linebreaker.js (linebreaker.js:161)
at __webpack_require__ (bootstrap b937441…:54)
at Object.../../../../pdfmake/src/textTools.js (textTools.js:4)
at __webpack_require__ (bootstrap b937441…:54)
at Object.../../../../pdfmake/src/docMeasure.js (docMeasure.js:4)
at __webpack_require__ (bootstrap b937441…:54)
at Object.../../../../pdfmake/src/layoutBuilder.js (layoutBuilder.js:7)
at __webpack_require__ (bootstrap b937441…:54)

解决此问题的解决方法是:

将pdfmake.js和vfs_fonts.js复制到assets文件夹,然后将其添加到index.html:

<script src='assets/pdfmake.min.js'></script>
<script src='assets/vfs_fonts.js'></script>

从app.component.ts

中删除它
import * as pdfMake from 'pdfmake';

并将其添加到app.component.ts:

declare var pdfMake: any;

最后从.angular-cli.js中删除它:

"../node_modules/pdfmake/build/pdfmake.js",
"../node_modules/pdfmake/build/vfs_fonts.js"

它有效,但它仍然是一种解决方法。

任何人都知道如何以Angular / Typscript的方式使用这个库?

非常感谢!

4 个答案:

答案 0 :(得分:18)

按照@benny_boe上面的说明,我已经成功了!让我总结如下:

首先,

npm install pdfmake --save

其次,在下面添加到typings.d.ts:

declare module 'pdfmake/build/pdfmake.js';
declare module 'pdfmake/build/vfs_fonts.js';

第三,在使用pdfMake的文件中,无论是组件还是服务,请添加以下行:

import * as pdfMake from 'pdfmake/build/pdfmake.js';
import * as pdfFonts from 'pdfmake/build/vfs_fonts.js';
pdfMake.vfs = pdfFonts.pdfMake.vfs;

最后,像往常一样使用pdfMake.xxx()。

答案 1 :(得分:10)

首先是第一件事。您需要将第三方脚本添加到.angular-cli.json AND 在TS文件中添加导入。看一下Angular CLI中的Global scripts故事。

  

通过脚本数组导入库后,您应该通过TypeScript代码中的import语句导入它...

pdfmake没有任何类型,因此您在取消配置文件时需要声明它们。)

因此,如果您想将其添加到TS文件中......请将您的import * as pdfMake from 'pdfmake';(服务器端版本!)替换为客户端版本('pdfmake/build/pdfmake')。您还需要添加字体('pdfmake/build/vfs_fonts'),否则您也会收到错误。

当您的导入看起来像这样时,它应该有效:

import pdfMake from 'pdfmake/build/pdfmake';
import pdfFonts from 'pdfmake/build/vfs_fonts';
pdfMake.vfs = pdfFonts.pdfMake.vfs;

答案 2 :(得分:2)

如果您仔细按照说明操作,则根据angular-cli Stories Global Scripts使用全局脚本时的另一种简单方法。 IF 图书馆没有任何类型。

在angular-cli.json文件

"scripts": [
  "../node_modules/pdfmake/build/pdfmake.min.js",
  "../node_modules/pdfmake/build/vfs_fonts.js"
],

ON src / typings.d.ts文件

在下面添加declare var pdfMake: any;行。

现在,您的应用程序中的任何地方都可以使用pdfMake全局变量。

尝试在构造函数或任何init方法中记录pdfMake

ngOnInit() { console.log(pdfMake); }

<强>输出

{
    createdPdf: f(t),
    vfs: {
        Roboto-Italic.ttf: "some long encoded string...",
        Roboto-Medium.ttf: "some long encoded string...",
        Roboto-MediumItalic.ttf: "some long encoded string...",
        Roboto-Regular.ttf: "some long encoded string...",
    }
}

这意味着它可以随时使用。

答案 3 :(得分:0)

npm i pdfmake;

import * as pdfMake from 'pdfmake/build/pdfmake';
import * as pdfFonts from 'pdfmake/build/vfs_fonts';

pdfMake.vfs = pdfFonts.pdfMake.vfs;
  var dd = {
    content: [
      {
        layout: 'lightHorizontalLines', // optional
        table: {
          // headers are automatically repeated if the table spans over multiple pages
          // you can declare how many rows should be treated as headers
          headerRows: 1,
          widths: [ '*', 'auto', 100, '*' ],

          body: [
            [ 'First', 'Second', 'Third', 'The last one' ],
            [ 'Value 1', 'Value 2', 'Value 3', 'Value 4' ],
            [ { text: 'Bold value', bold: true }, 'Val 2', 'Val 3', 'Val 4' ]
          ]
        }
      }
    ]
  };
pdfMake.createPdf(dd).download();