Подтвердить что ты не робот

PhantomJS: вход для труб

Я пытаюсь использовать 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 создан, но пуст. Я что-то пропустил?

4b9b3361

Ответ 1

Вы можете делать то, что ищете очень просто (это просто не документировано) прямо в 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 приходит в stdin, PDF файл выходит из stdout. Вы можете проверить его как:

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