Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to read an image from phantomjs stdout in nodejs to serve it?

There's probably some detail that I'm missing, because the rasterization script works fine standalone, but I haven't been successful reading its output from NodeJS so far.

Here's the NodeJS part:

var http = require('http');
var qs = require('querystring');
var fs = require('fs');
var spawn = require('child_process').spawn;

var SCRIPT = fs.readFileSync('./script.js', { encoding: 'utf8' });

http.createServer(function (request, response) {
    var body = '';
    request.on('data', function (data) {
        body += data;
    });
    request.on('end', function () {
        var postData = qs.parse(body);
        var phantomOut = '';
        var phantom = spawn('phantomjs');
        phantom.stdout.on('data', function (buf) {
            phantomOut += buf;
        });
        phantom.on('exit', function (code) {
            response.writeHead(200, {
                'Content-Type': 'image/png'
            });
            response.end(phantomOut);
        });
        phantom.stdin.setEncoding('utf8');
        phantom.stdin.write( SCRIPT.replace('(#imageData)', postData.imageData) );
    });
}).listen(1337, '127.0.0.1');

And here's the 'script.js' that is executed by PhantomJS:

var page = require('webpage').create();
page.content = '<img src="(#imageData)">';
window.setTimeout(function () {
    page.render('/dev/stdout', { format: 'png' });
    phantom.exit();
}, 1);

What I'd like to do is to render Base64 encoded image to PNG with phantomjs to stdout, read that image in nodejs and then serve it.

What am I doing wrong?

like image 792
Vitaly Avatar asked Oct 20 '22 10:10

Vitaly


1 Answers

I noticed that you have found a solution. Just for the sake of others who may land here, here is a far easier answer:

PhantomJS:

var base64 = page.renderBase64('PNG');
system.stdout.write(base64);
phantom.exit();

Node (using phantomjs-prebuilt):

childProcess.execFile(binPath, childArgs, function(err, stdout, stderr) {
  var buf = new Buffer(stdout, 'base64');
  fs.writeFile('test.png', buf);
}
like image 194
Jesse Chilcott Avatar answered Nov 01 '22 12:11

Jesse Chilcott