Search code examples
javascriptnode.jsjspdfnodemailer

Create PDF with jspdf and send via nodemailer Node.js


In my Node.js server I am creating a PDF file, (But I am not saving it on my disk), My idea is to create the PDF file and after that send it via nodemailer this is my code:

app.js

const { jsPDF }   = require("jspdf");

const doc = new jsPDF();
doc.text("Hello world!", 10, 10);

email_send.send_pdf(doc);

email_send.js

exports.send_pdf = function(doc) {
  var transporter = helpers.transporter();
  var mailOptions = {
  from:    'xxx@email.com',
  to:      'xxx@email.com',
  subject: "PDF",
  html:
  '<!DOCTYPE html>'+
  '<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:o="urn:schemas-microsoft-com:office:office">'+
    '<head>'+
      '<meta charset="utf-8">'+
      '<title>THIS IS AN EMAIL</title>'+
      '<meta name="viewport" content="width=device-width,initial-scale=1" />'+
      '<meta name="x-apple-disable-message-reformatting" />'+
      '<style>'+
        'table,'+
        'td,'+
        'div,'+
        'h1,'+
        'p {'+
          'font-family: Arial, sans-serif;'+
        '}'+
      '</style>'+
    '</head>'+
    '<body style="margin: 0; padding: 0; padding-top: 20px">'+
      '<p style="margin: 0 0 12px 0; font-size: 10px; line-height: 24px; font-family: Arial, sans-serif">'+
        '<b>Your email with pdf file is:</b> '+
      '</p>'+
    '</body>'+
  '</html>',
  attachments: [
    {
      filename: "mypdf.pdf",
      content: doc.output('arraybuffer')
    }
  ]
  };
  transporter.sendMail(mailOptions)
  .then(function(info) {
    console.log('success');
  })
  .catch(function(error) {
    console.log("----ERROR------");
  }); 
}

I have seen some blogs say: put something like this doc.output('arraybuffer') or doc.output('datauristring') But always I have the following error:

TypeError [ERR_INVALID_ARG_TYPE]: The "chunk" argument must be one of type string or Buffer. Received type object )

So, How can I fix it, all is developed in Node.js server.


Solution

  • It looks like nodemailer wants a "real" Buffer for attachments, which you can create from ArrayBuffer:

    Buffer.from(doc.output('arraybuffer'))