Создайте pdf файл с помощью pdfkit и отправьте его в браузер в nodejs-expressjs

Я использую pdfkit для создания pdf файла, и я хочу отправить этот pdf файл в браузер.

Но я получаю сообщение "TypeError: listener must be a function", Кроме того, файл получает генерировать в моем родительском каталоге, который я не хочу.

Может ли кто-нибудь объяснить мне, как сгенерировать pdf файл и отправить его в браузер, не сохраняя его в родительском каталоге?
Я использую expressjs здесь.

Мой код

var PDFDocument = require('pdfkit');                      
var fs=require('fs');
doc = new PDFDocument();
doc.moveTo(300, 75)
   .lineTo(373, 301)
   .lineTo(181, 161)
   .lineTo(419, 161)
   .lineTo(227, 301)
   .fill('red', 'even-odd');  

var loremIpsum = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam in...';  

doc.y = 320;
doc.fillColor('black')
doc.text(loremIpsum, {
   paragraphGap: 10,
   indent: 20,
   align: 'justify',
   columns: 2
});  

doc.write('out.pdf');
res.download('out.pdf');

Ответы

Ответ 1

doc.write - это строка, вызывающая проблему, которая также является устаревшим методом, поэтому не используйте ее. Вместо этого используйте трубку, чтобы сообщить вашему документу, куда передавать информацию, и не забудьте закрыть ее с помощью doc.end(), то есть следующим образом:

doc = new PDFDocument();
doc.pipe( fs.createWriteStream('out.pdf') );

// rest of the code goes here...

doc.end();

Обратите внимание, что это не важно, что doc.pipe() находится наверху, это имеет смысл для меня (вы можете положить его до или после doc.end(). Это не имеет значения, все будет хорошо работать). Наконец, обратите внимание, что вы можете использовать pipe для потоковой передачи непосредственно в ответ, нет необходимости сначала создавать файл, а затем загружать его, то есть:

doc.pipe( fs.createWriteStream(res) )

Ответ 2

Итак, попробуйте использовать

doc.pipe(RES);