2012-09-13 167 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