Meteor - Dynamically Render a PDF with iron:router
A cool trick I found out recently is how to dynamically render a pdf from the server to the client using iron:router. The idea is you have a pdf object stored in a database or external file store and you want to transfer that pdf to the client without directly accessing the pdf file. We are going to accomplish this with a server side iron:router route. You can access the full code for this tutorial on my GitHub page here.
The Route File
The first method of rendering the pdf from the server involves the wonderful CollectionFS package which can be used to store files in a variety of different data stores including mongoDB, dropbox, and Amazon S3. We can accomplish this with the below code:
Some important thigns to note include the creation of a readable object through
file.createReadStream("tmp") which we then read into the
buffer object. Once we have completely read from the
FS.File object we can write the response to the client through the node
this.response.write(buffer); statement. Also make sure to include the
where: "server" in the route to ensure that it only executes as a server side route.
An additional way to render a pdf from the server to the client is to read the pdf from the file system, read it into a buffer using the node.js
fs package, and feed it to the client. Make sure you install the
meteorhacks:npm package so you can include the
fs node.js package. You can accomplish all this with the below code:
Pretty straight forward and similar to the above gist.
That’s it for this tutorial, hopefully it helps out anyone who wants to dynamically render a pdf from the server without directly accessing the file. Again the full code for this tutorial is available on my GitHub page. If you have any questions please leave them in the comments!
Curtis Larson is a LA based freelance software developer. Follow him on Twitter or send him an email if you're looking for a talented developer.