/** * Generating PDF from website screenshot. * * Using iron:router's server-side route and meteorhacks:npm to load Webshot NPM package. * Don't forget to add "webshot": "0.16.0" to your packages.json file. Example: * { * "webshot": "0.16.0" * } * Tried it with bryanmorgan:webshot but it didn't work so sticking to loading NPM package directly. * Thanks to @nate-strauser (https://github.com/nate-strauser). */ Router.route('generatePDF', { path: '/invoices/:_id/generate-pdf', // example route with _id param where: 'server', action: function() { // Get invoice ID parameter var invoiceId = this.params._id; // Setting name for our generated PDF var fileName = "invoice_" + invoiceId + ".pdf"; // Load NPM packages var webshot = Meteor.npmRequire('webshot'); var fs = Npm.require('fs'); var Future = Npm.require('fibers/future'); var fut = new Future(); // Set path to your route here - Meteor.absoluteUrl() is your root url ("http://localhost:3000/") var url = Meteor.absoluteUrl('invoices/' + invoiceId); // Meteor.absoluteUrl('path/to/your/route'); // How you want your PDF to look, it also waits 3 seconds just to make sure photo has been taken var options = { "renderDelay": 3000, "paperSize": { "format": "Letter", "orientation": "portrait", "margin": "1cm" } }; // Magic happens here... webshot(url, fileName, options, function(err) { if (err) { return console.log(err); } else { fs.readFile(fileName, function (error,data) { if (error) { return console.log(err); } fs.unlinkSync(fileName); fut.return(data); }); } }); // Give our generated PDF to the client this.response.writeHead(200, {'Content-Type': 'application/pdf',"Content-Disposition": "attachment; filename=" + fileName}); this.response.end(fut.wait()); } });