PhantomJS:管道输入

16
我想使用PhantomJS将一个html页面呈现为pdf格式。我不想将文件写入磁盘,而是在内存中拥有html,并且希望在内存中获得pdf。
使用该问题下Pooria Azimi的出色答案(链接),我能够从命名管道中获取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已经被创建,但是是空白的。我是否漏掉了什么?

1个回答

32

你可以在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


这实际上是我已经尝试过的事情,发现它不起作用。然而,在下载最新版本后,它确实可以工作。谢谢! - mads
使用“load”事件不是更好吗?这样你就知道所有内容都已经加载完成,而不是使用setTimeout。 - oligofren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接