2012-09-13 33 views
14

Estoy tratando de usar PhantomJS para representar una página html en pdf. No quiero escribir los archivos en el disco, tengo el html en la memoria, y quiero el pdf en la memoria.PhantomJS: entrada de tubería

Usando la excelente respuesta de Pooria Azimi al this question, puedo obtener el pdf de una tubería con nombre. Cuando intento lo mismo en el otro extremo (reemplazando el archivo de entrada con una tubería con nombre), termino con un pdf en blanco.

Esto es lo que estoy haciendo ahora (simplificado):

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

Luego, en otro terminal: se crea

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

El out.pdf archivo, pero está en blanco. ¿Me estoy perdiendo de algo?

Respuesta

30

Puede hacer lo que está buscando de manera muy simple (no está realmente documentado) directamente en 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); 

(Puede necesitar aumentar el tiempo de espera si tiene imágenes que necesitan de carga, etc.)

HTML viene en la entrada estándar, PDF binaria se apaga la salida estándar. Se puede comprobar que le gusta:

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

+0

Esto es realmente algo que ya probé, y se encontró que no funcionaba. Sin embargo, después de descargar la versión más nueva, de hecho funciona. ¡Gracias! – mads

+0

En lugar de usar setTimeout, ¿no sería mejor utilizar el evento "cargar"? De esa forma sabes que todo se ha cargado. – oligofren