I'm trying to create a Node server that generates a PDF on-the-fly using PDFKit. The PDF is generated based on parameters from a POST request (via Express). One of the parameters specifies an image URL, which the server downloads and injects into the PDF.
Right now, I have the following structure:
// Get dependencies var express = require('express'), http = require('http'), fs = require('fs'), pdfDocument = require('pdfkit'); // Get express started. var app = express(); // Use JSON in POST body app.use(express.json()); // Setup POST response app.post('/post_pdf', function(req, res) { // Get the PDF initialized var doc = new pdfDocument(); // Set some headers res.statusCode = 200; res.setHeader('Content-type', 'application/pdf'); res.setHeader('Access-Control-Allow-Origin', '*'); // Header to force download res.setHeader('Content-disposition', 'attachment; filename=Untitled.pdf'); // Pipe generated PDF into response doc.pipe(res); /** * Generate PDF contents */ // Prepare write stream for image var image = fs.createWriteStream('image.jpeg'); // Download image http.get("http://dummyimage.com/640.jpeg", function(response) { // Pipe response into image write stream // (because PDFKit needs to read from a saved file) response.pipe(image).on('close', function() { // Read data back, make sure there are no errors fs.readFile('image.jpeg', function(err, data) { if (err) throw err; /** * Use `data` to get image info (width, height, etc.) * ------------------ * Inject image */ // Close document and response doc.end(); res.end(); return; }) }); }); }); I have two questions:
- Is there a less messy way to do this, perhaps with fewer nested callbacks? I'm totally open to adding another dependency to make life easier.
- Right now, the code above does not work. It returns a PDF, but the PDF is corrupted (according to Preview). Any tips as to why this could be occurring are very welcome.