Сгенерируйте 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');

2 ответа

Решение

doc.write это линия, вызывающая проблему, которая также является устаревшим методом, поэтому не используйте ее. Вместо этого используйте pipe, чтобы сообщить своему документу, куда следует передавать информацию, и не забудьте закрыть ее, используя 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) )

Так что вместо этого попробуйте использовать

doc.pipe(RES);

Другие вопросы по тегам