Ankur Soni
Ankur Soni

Reputation: 6018

How to generate PDF from HTML in Meteor 1.4.4.2 and 1.5 at server side

I am facing problems while creating a PDF from HTML in Meteor 1.4.4.2 and 1.5 which is latest version till date.

I want to know how to create a PDF from HTML at server side?

Upvotes: 3

Views: 1345

Answers (1)

Ankur Soni
Ankur Soni

Reputation: 6018

Below are the steps to generate PDF from HTML Template using Meteor 1.4.4.2

  1. Kindly goto PROJECT/.meteor/packages file and add packages as below

    meteorhacks:ssr
    bryanmorgan:webshot
    
  2. Make sure whichever html page you want to convert to pdf must be present at location PROJECT/private as per Meteor 1.4.4.2 guidelines. In this example, the file name is app_clientagreement.html (file is simple html).
  3. We will now create a method at server side to generate PDF. The file is at location PROJECT\imports\startup\server\methods.js (make sure you import the method.js file inside PROJECT\imports\startup\server\index.js as import './methods.js'). Inside methods.js write below code

    import { Meteor } from 'meteor/meteor';
    import { SSR, Template } from 'meteor/meteorhacks:ssr';
    
    Meteor.methods({
        'generate_pdf'(){
    
        var fs      = Npm.require('fs');
        var Future = Npm.require('fibers/future');
        var fut = new Future();
        var fileName = "pokemon-report.pdf";
    
        SSR.compileTemplate('agreement', Assets.getText('app_clientagreement.html'));
        var html_string = SSR.render('agreement');
    
        var options = {
              "paperSize": {
                  "format": "Letter",
                  "orientation": "portrait",
                  "margin": "1cm"
              },
              siteType: 'html'
        };
    
          webshot(html_string, fileName, options, function(err) {
              fs.readFile(fileName, function (err, data) {
                  if (err) {
                      return console.log(err);
                  }
                  fs.unlinkSync(fileName);
                  fut.return(data);
              });
          });
    
          let pdfData = fut.wait();
          let base64String = new Buffer(pdfData).toString('base64');
    
          return base64String;
      }
    });
    
  4. To call this method in Template, for ease to get auto-called, I am calling it when a template is rendered. The code is below,

    Template.App_Agreement.onRendered(function(){
          Meteor.call('generate_pdf', function(err, res) {
            if (err) {
                 console.error(err);
            } else if (res) {
                 window.open("data:application/pdf;base64, " + res);
            }
          });
    });
    

When you call above template (which is 'App_Agreement'), a new tab is opened and a PDF is rendered.

Upvotes: 2

Related Questions