2016-10-27 13 views
0

Я пытаюсь создать pdf-файл динамически с помощью PDFkit и хочу отправить его в виде вложения в электронном письме. После этого http://pdfkit.org/demo/browser.html примера и этой https://nodemailer.com/using-attachments/ документации, которую я написал следующий код:Отправка PDF-файла, созданного динамически в виде вложения с использованием PDFKit в приложении nodejs

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: '[email protected]', // 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('/'); 
        }); 



     }); 

Но я получаю следующее сообщение об ошибке:

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) 

Как я должен решить эту проблему?

ответ

0

Не используйте BlobStream. Записать в буфера, а как предложено здесь: how to convert pdfkit object into buffer using nodejs

let pdf = new pdfkit(); 

let 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(); 

Я использовал этот подход и был в состоянии использовать nodemailer с буфером Attachmend и отправить правильный PDF.