Angular2: как использовать библиотеку pdfmake

попытка использовать клиентскую библиотеку pdf в моем Angular 2 (версия=4.2.x) проект.

In .угловой-cli.файл json, я объявил js следующим образом:

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

а затем в приложении.деталь.ТС, я использовал его так:

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 и затем добавить в индекс.HTML-код:

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

удалить из приложения.деталь.ТС

import * as pdfMake from 'pdfmake';

и добавить в приложение.деталь.ТС:

declare var pdfMake: any;

наконец удалите это .угловой-cli.js:

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

это работает, но это все-таки временное решение.

кто-нибудь знает, как использовать эту библиотеку в Angular/Typscript?

Спасибо большое!

3 ответов


следуя инструкции выше, сделанной @benny_boe, я сделал это работать! Позвольте мне резюмировать его следующим образом:

во-первых,

npm install pdfmake --save

во-вторых, добавьте ниже к наборам.д.ТС:

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.ХХХ() как обычно.


сначала о главном. Ты не нужно добавить вам сторонние скрипты в .angular-cli.json и добавьте импорт в файлы TS. Взгляните на глобальные скрипты история из углового CLI.

как только вы импортируете библиотеку через массив скриптов, Вы должны не импортируйте его с помощью инструкции import в коде TypeScript...

(нет typings для pdfmake поэтому вам нужно объявить их, когда unsing файл config..)

поэтому, если вы хотите добавить его в свой файл 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;

еще один простой подход при использовании глобальных скриптов в соответствии с angular-cli Истории Глобальных Скриптов если вы внимательно следуйте инструкции. если библиотеки нет typings.

на угловой-cli.файл json

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

на src / typings.d.TS file

добавить declare var pdfMake: any; строку ниже.

теперь в любом месте вашего приложения pdfMake глобальная переменная сейчас доступный.

попробуйте войти pdfMake в contructor или любые методы init

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...",
    }
}

что означает, что он готов к использованию.