2014-04-07 3 views
5

Es gibt wahrscheinlich einige Details, die ich vermisse, weil das Rasterisierungs-Skript eigenständig funktioniert, aber ich konnte seine Ausgabe von NodeJS bisher nicht lesen.Wie liest man ein Bild von phantomjs stdout in nodejs, um es zu bedienen?

Hier ist der NodeJS Teil:

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'); 

Und hier ist die 'script.js', die von PhantomJS ausgeführt wird:

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

Was ich möchte, ist zu tun, Base64 kodierte Bild zu machen Um PNG mit phantomjs nach stdout zu lesen, lies das Bild in nodejs und diene dann.

Was mache ich falsch?

+0

wäre schön, wenn jemand würde darüber nachdenken, dies zu beantworten. In phantomjs funktionieren viele node.js Sachen einfach nicht. einschließlich fs.readFileSync() – holms

+0

Wenn Sie sich wundern, ich endete beim Erstellen eines temporären Skripts mit der , Erstellen von Phantomjs als Prozess und übergibt den Pfad an das Skript als Parameter. Dann lesen Sie das generierte Bild, wenn phantomjs Prozess existiert in Nodejs, Serving es und entfernen Sie sowohl das Skript und das Bild, sobald das letztere serviert wird. Scheint sehr gut zu arbeiten. – Vitaly

+0

@Vitaly ist dies verwandt: http://StackOverflow.com/Questions/19512983/Phantomjs-PDF- to-stdout? rq = 1? –

Antwort

3

Ich habe festgestellt, dass Sie eine Lösung gefunden haben. Nur für das Wohl der anderen, die hier landen, ist hier eine weit einfachere Antwort:

PhantomJS:

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

Node (PhantomJS-prebuilt verwenden):

childProcess.execFile(binPath, childArgs, function(err, stdout, stderr) { 
    var buf = new Buffer(stdout, 'base64'); 
    fs.writeFile('test.png', buf); 
} 
Verwandte Themen