pdfMake - не удается открыть файл

Я использовал этот модуль на Nodejs: https://github.com/bpampuch/pdfmake

Вот мой код для его создания:

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

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


module.exports.generateFile = function (data,callback) {

    let fileName = "Logins_" + data[0]["userLogin"] + ".pdf";
    let filePath = __dirname + "/files/" + fileName;

    let logins = [ ['userLogin', 'softwarePassword', 'softwareName'] ];
    for (let obj of data) {
        let arr = [];
        for(let x in obj){
            arr.push(obj[x]);
        }
        logins.push(arr);
    }

    let docDefinition = {
        content: [
            {
                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: logins
                }
            }
        ]
    };

    try {

        let chunks = [];
        let result;

        let doc = printer.createPdfKitDocument(docDefinition);
        doc.pipe(fs.createWriteStream(filePath));
        doc.end();
        callback(null,fileName,filePath)
    } catch (err){
        callback(err);
    }
    };

Я получил этот экран:

Есть идеи, ребята? В обратном вызове я использую res.download с именем файла и путем к файлу. я пробовал все

введите здесь описание изображения


person jy95    schedule 08.02.2017    source источник
comment
Вы нашли ответ?   -  person Marcia Ong    schedule 02.01.2018
comment
Один из этих двух ответов на ссылки помог найти решение, но я не помню, какой именно ^^   -  person jy95    schedule 03.01.2018
comment
Оба указывают на одну и ту же ссылку. Спасибо, я уже исправил свою проблему.   -  person Marcia Ong    schedule 05.01.2018


Ответы (1)


Рабочее решение протестировано на локальном и узловом серверах

Причина, по которой pdfmake не может открыть файл, заключается в том, что файловый поток fs все еще записывает в блок памяти, что делает его нечитаемым, а загруженный PDF-файл будет поврежден с размером 0 КБ.

Решение: добавьте прослушиватель событий в fs.createWriteSteam и подождите, пока fs закончит запись, а затем отправьте файл.

var temp123;
pdfDoc.pipe(temp123 = fs.createWriteStream('./PDF/' + name), { encoding:'utf16' });

pdfDoc.end();

temp123.on('finish', async function () {
  // do send PDF file 
  res.download('name.pdf');
});
person Marcia Ong    schedule 13.03.2018
comment
Я попробовал этот код, и в моем случае res не возвращает PDF обратно клиенту. - person Mike B.; 20.10.2019
comment
@МайкБ. Вы пользуетесь экспрессом? Решение для экспресс, expressjs.com/en/api.html#res.download< /а> - person Marcia Ong; 21.10.2019