Как создать PDF на Node.js с помощью PDFMake и vfs_fonts?

Похоже, этот вопрос был задали довольно много times с более старыми версиями PDFMake, но не был обновлен тем, что кажется последняя структура каталогов. Кроме того, копирование шрифтов в корневую папку «шрифты» не очень удобно.

Как мне получить серверную версию PDFMake ("pdfmake": "^0.1.31"), работающую на Node.js с включенным файлом vfs_fonts.js?

Установить с помощью npm в командной строке

npm install pdfmake fs --save

Загрузите приложение Node.js index.js со следующим:

var fonts = {
    Roboto: {
        normal: 'fonts/Roboto-Regular.ttf',
        bold: 'fonts/Roboto-Medium.ttf',
        italics: 'fonts/Roboto-Italic.ttf',
        bolditalics: 'fonts/Roboto-MediumItalic.ttf'
    }
};

var PdfPrinter = require('pdfmake/src/printer');
var printer = new PdfPrinter(fonts);

var dd = {
    content: [
        'First paragraph',
        'Another paragraph'
    ]
}
var pdfDoc = printer.createPdfKitDocument(dd);
pdfDoc.pipe(fs.createWriteStream('basics.pdf')).on('finish',function(){
    //success
});
pdfDoc.end();

Хит беги и бац:

/usr/local/bin/node index.js
fs.js:640
  return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
                 ^
Error: ENOENT: no such file or directory, open 'fonts/Roboto-Regular.ttf'
    at Error (native)
    at Object.fs.openSync (fs.js:640:18)

Проблема, похоже, связана с расположением файлов fonts/Roboto.... На стороне клиента это решается включением файла vfs_fonts.js. На стороне сервера, я не уверен. НЕТ папки шрифтов или файлов .ttf. Метеорный фреймворк пример, который я нашел, не кажется применимым.

Любые идеи? Все официальные примеры ссылаются на папку src/fonts. Не лучший способ использовать серверный модуль установки npm.


person Will Lovett    schedule 19.07.2017    source источник
comment
Вам не нужно включать шрифт Roboto на стороне сервера, он доступен по умолчанию. Если вам нужны пользовательские шрифты, вам необходимо выполнить шаги, указанные на странице github.com/bpampuch/pdfmake/wiki/Пользовательские шрифты --- на стороне клиента   -  person Akshay Soam    schedule 11.09.2017


Ответы (2)


Это то, что я сделал, чтобы решить эту проблему.

Загрузил модуль «roboto-font»: «0.1.0» и назначил путь к этим шрифтам в объекте Roboto, и все заработало нормально.

let fonts = {
    Roboto: {
        normal: 'node_modules/roboto-font/fonts/Roboto/roboto-regular-webfont.ttf',
        bold: 'node_modules/roboto-font/fonts/Roboto/roboto-bold-webfont.ttf',
        italics: 'node_modules/roboto-font/fonts/Roboto/roboto-italic-webfont.ttf',
        bolditalics: 'node_modules/roboto-font/fonts/Roboto/roboto-bolditalic-webfont.ttf'
    }
};
let printer = new pdfMake(fonts);
let pdfDoc = printer.createPdfKitDocument(pdfData);
pdfDoc.pipe(fs.createWriteStream(reportName));
pdfDoc.end();
person Ninja    schedule 25.01.2019

Сначала вам необходимо загрузить шрифт Roboto здесь https://fonts.google.com/specimen/Roboto и скопируйте их в папку со шрифтами. Обновите объект шрифтов следующим образом:

var fonts = {
  Roboto: {
    normal: path.join(__dirname, '..', 'your_public_folder', '/fonts/Roboto-Regular.ttf'),
    bold: path.join(__dirname, '..', 'your_public_folder', '/fonts/Roboto-Medium.ttf'),
    italics: path.join(__dirname, '..', 'your_public_folder', '/fonts/Roboto-Italic.ttf'),
    bolditalics: path.join(__dirname, '..', 'your_public_folder', '/fonts/Roboto-MediumItalic.ttf')
  }
}

В этом примере замените «your_public_folder» именем папки, в которой находятся все ваши файлы html, css и js.

person Harry    schedule 11.08.2017
comment
Спасибо за помощь, но я искал кое-что другое: плюс копирование шрифтов в корневую папку шрифтов не очень хорошо. Как мне получить серверную версию pdfMake (pdfmake: ^0.1.31), работающую на NodeJs, с включенным файлом vfs_fonts.js? - person Will Lovett; 11.08.2017
comment
Файл vfs_fonts.js требуется только в том случае, если вы хотите использовать pdfMake на клиентской стороне. Этот файл представляет собой двоичный файл, который включает в себя шрифты. Вам не нужно создавать этот файл, чтобы использовать его с nodejs. В nodejs вам нужно указать путь с вашими шрифтами, как я ответил ранее. - person Harry; 15.08.2017