2012-09-13 52 views
14

我正在尝试使用PhantomJS将html页面呈现为pdf。 我不想将文件写入磁盘,我在内存中有html,并且我想要内存中的pdf。PhantomJS:管道输入

使用Pooria Azimi在this question的出色答案,我可以从命名管道获得pdf。当在另一端尝试相同的时候(用命名管道替换输入文件),我最终得到一个空白的pdf。

这就是我现在所做的(简化):

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

然后在另一个终端:创建

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

文件out.pdf,但是是空白的。我错过了什么吗?

回答

30

您可以直接在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); 

(可能需要增加超时,如果你有需要加载图像等)

HTML进来标准输入,PDF二进制熄灭标准输出。您可以测试它想:

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

+0

这其实是我已经尝试过,并发现它没有工作。但是,在下载最新版本后,它确实有效。谢谢! – mads

+0

而不是使用setTimeout会不会更好使用“加载”事件?这样你就知道一切都已经加载了。 – oligofren