Sending a PDF created dynamically as an attachment using PDFKit in a nodejs application
blob, node.js, nodemailer, pdf, pdfkit
Solution
Don't use BlobStream. Write to buffers instead as suggested here: how to convert pdfkit object into buffer using nodejs
const pdf = new pdfkit();
const buffers = [];
pdf.on('data', buffers.push.bind(buffers));
pdf.on('end', () => {
let pdfData = Buffer.concat(buffers);
const mailOptions = {
from: '...',
to: '...',
attachments: [{
filename: 'attachment.pdf',
content: pdfData
}]
};
mailOptions.subject = 'PDF in mail';
mailOptions.text = 'PDF attached';
return mailTransport
.sendMail(mailOptions)
.then(() => {
console.log('email sent:');
})
.catch(error => {
console.error('There was an error while sending the email:', error);
});
});
pdf.text('Hello', 100, 100);
pdf.end();
I used this approach and was able to use nodemailer with buffer Attachmend and send a correct pdf.
Problem
I am trying to create a pdf dynamically using PDFkit and want to send it as an attachment in a email. Following this http://pdfkit.org/demo/browser.html example and this https://nodemailer.com/using-attachments/ documentation I wrote the following code: ``` var doc = new PDFDocument(); var stream = doc.pipe(blobStream()); doc.text("Howdy!!"); doc.on('end'); stream.on('finish', function() { var htmlMailBody ='Hi' var textMailBody = 'hi'; var mailOptions = { from: 'ASD', // sender address to: 'ecell@sfitengg.org', // list of receivers subject: 'Invitation ', // Subject line text: textMailBody, // plaintext body alt for html html: htmlMailBody, attachments:[ { filename:"TEST1.pdf", path:stream.toBlobURL('application/pdf') }] }; // send mail with defined transport object transporter.sendMail(mailOptions, function(error, info){ if(error){ return console.log(error); } console.log('Message sent: ' + info.response); res.redirect('/'); }); }); ``` But i am getting the following error: ``` TypeError: listener must be a function at PDFDocument.addListener (events.js:197:11) at PDFDocument.Readable.on (_stream_readable.js:665:33) at exports.getSendReport (d:\projects\PDFChecker\server\controllers\pdf.js:159:6) at Layer.handle [as handle_request] (d:\projects\PDFChecker\node_modules\express\lib\router\layer.js:95:5) ``` How should i solve it?