Итерация данных и создание страниц с помощью PDFKit

Я хочу создавать страницы в pdfkit, используя цикл for. В своем приложении я создал новый модуль, который загружается по запросу (все это прекрасно работает, и я могу создать pdf без цикла). С циклом pdfkit создает pdf, но тогда этот не работает.

Код из модуля:

module.exports = function () {

var Project = require('./models/projects');
var PDFDocument = require('pdfkit');
var doc = new PDFDocument;

doc.fontSize(25);
doc.text('Portfolio');

Project
    .find()
    .exec(function (err, projects) {
      if (err) {
          console.log(err);
      } else {
        projects.forEach(function (project) {

            var project_customer = project.customer;

            doc.addPage();
            doc.text('project_customer');

        });
      }
    });

doc.addPage();
doc.text('project_customer');

doc.save();

    doc.write('./output.pdf');

}

Есть ли решение, как я могу получить неповрежденный PDF-файл?


person pkberlin    schedule 28.02.2016    source источник


Ответы (1)


В вашем коде Project.find().exec(...) выполняется асинхронно. Это означает, что вы создаете PDF-документ и сохраняете его до завершения вызова Project.find().exec(...).

Я предлагаю переместить код PDF в обратный вызов, включенный в exec(), например так:

module.exports = function () {

    var Project = require('./models/projects');
    var PDFDocument = require('pdfkit');

    Project
      .find()
      .exec(function (err, projects) {
        if (err) return console.log(err);

        var doc = new PDFDocument;
        doc.fontSize(25);
        doc.text('Portfolio');

        projects.forEach(function (project) {

          var project_customer = project.customer;

          doc.addPage();
          doc.text('project_customer');
        });

        doc.addPage();
        doc.text('project_customer');

        doc.save();

        doc.write('./output.pdf');

      });
}
person mikefrey    schedule 28.02.2016
comment
Боже мой, ты прав. Спасибо, я забыл, что код работает асинхронно. Теперь он работает нормально. - person pkberlin; 28.02.2016