2012-09-13 7 views
14

Ich versuche PhantomJS zu verwenden, um eine HTML-Seite in PDF zu rendern. Ich möchte nicht die Dateien auf die Festplatte schreiben, ich habe die HTML im Speicher, und ich möchte die PDF im Speicher.PhantomJS: Pipe-Eingang

Mit der ausgezeichneten Antwort von Pooria Azimi bei this question kann ich das PDF von einer Named Pipe bekommen. Wenn ich dasselbe am anderen Ende versuche (indem ich die Eingabedatei durch eine Named Pipe ersetze), lande ich mit einem leeren PDF. Diese

ist, was ich tue jetzt (vereinfacht):

mkfifo in_pipe.html out_pipe.pdf 
./phantomjs rasterize.js in_pipe.html out_pipe.pdf 

Dann in einem anderen Terminal:

echo '<center>hey!</center>' > in_pipe.html 
cat out_pipe.pdf > out.pdf 

Die Datei out.pdf wird erstellt, aber leer ist. Fehle ich etwas?

Antwort

30

Sie können einfach tun, was Sie suchen (es ist nur nicht wirklich dokumentiert) direkt in PhantomJS.

var page = require('webpage').create(), 
    fs = require('fs'); 

page.viewportSize = { width: 600, height: 600 }; 
page.paperSize = { format: 'Letter', orientation: 'portrait', margin: '1cm' }; 

page.content = fs.read('/dev/stdin'); 

window.setTimeout(function() { 
    page.render('/dev/stdout', { format: 'pdf' }); 
    phantom.exit(); 
}, 1); 

(müssen möglicherweise das Timeout erhöhen, wenn Sie Bilder haben, die Belastung benötigen, etc.)

HTML in stdin kommt, geht PDF binäre stdout aus. Sie können es testen möchte:

echo "<b>test</b>" | phantomjs makepdf.js > test.pdf && open test.pdf

+0

Dies ist eigentlich etwas, das ich schon probiert, und fand, dass es nicht funktioniert hat. Nach dem Herunterladen der neuesten Version funktioniert es jedoch tatsächlich. Vielen Dank! – mads

+0

Anstatt setTimeout zu verwenden, wäre es nicht besser, das Ereignis "load" zu verwenden? Auf diese Weise wissen Sie, dass alles geladen ist. – oligofren