Использование модуля 'webpage' Phantom в node.js - программирование
Подтвердить что ты не робот

Использование модуля 'webpage' Phantom в node.js

Я пытаюсь обернуть PhantomJS script в процессе node.js. phantom script захватывает URL-адрес из аргументов, предоставленных в командной строке, и выводит pdf (что очень похоже на пример rasterize.js, включенный в установку pahntom).

phantom script У меня все хорошо работает, только мой работодатель хочет, если возможно, node script. Нет проблем, я могу использовать модуль node - phantom node, чтобы его обернуть.

Но теперь я попал в камнем преткновения, у моего phantom script есть:

var page = require('webpage').create();

Итак, node.js пытается найти модуль под названием "веб-страница", модуль "веб-страницы" встроен в установку phantom, поэтому node не может ее найти. Насколько я могу судить, нет модуля npm под названием "веб-страница".

'webpage' используется следующим образом:

page.open(address, function (status) {

    if (status !== 'success') {

        // --- Error opening the webpage ---
        console.log('Unable to load the address!');

    } else {

        // --- Keep Looping Until Render Completes ---
        window.setTimeout(function () {
            page.render(output);
            phantom.exit();
        }, 200);
    }
});

где address - это url, указанный в командной строке, а вывод - другой аргумент, имя и тип файла.

Может ли кто-нибудь помочь мне? Это довольно абстрактно, поэтому я не ожидаю многого, если честно, но стоит попробовать.

Спасибо.

EDIT - Приблизительно через 2 часа

Теперь у меня есть это, что выдает PDF:

var phanty = require('node-phantom');

var system = require('system');

phanty.create(function(err,phantom) {

    //var page = require('webpage').create();

    var address;
    var output;
    var size;

    if (system.args.length < 4 || system.args.length > 6) {

        // --- Bad Input ---

        console.log('Wrong usage, you need to specify the BLAH BLAH BLAH');
        phantom.exit(1);

    } else {

        phantom.createPage(function(err,page){

            // --- Set Variables, Web Address, Output ---
            address = system.args[2];
            output = system.args[3];
            page.viewportSize = { width: 600, height: 600 };


            // --- Set Variables, Web Address ---
            if (system.args.length > 4 && system.args[3].substr(-4) === ".pdf") {

                // --- PDF Specific ---
                size = system.args[4].split('*');
                page.paperSize = size.length === 2 ? { width: size[0], height: size[1], margin: '0px' }
                                                   : { format: system.args[4], orientation: 'portrait', margin: '1cm' };
            }

            // --- Zoom Factor (Should Never Be Set) ---
            if (system.args.length > 5) {
                page.zoomFactor = system.args[5];
            } else {
                page.zoomFactor = 1;
            }

            //----------------------------------------------------

            page.open(address ,function(err,status){

                if (status !== 'success') {

                    // --- Error opening the webpage ---
                    console.log('Unable to load the address!');

                } else {

                    // --- Keep Looping Until Render Completes ---
                    process.nextTick(function () {
                        page.render(output);
                        phantom.exit();
                    }, 200);
                }

            });

        });
    }
});

Но! Это не правильный размер! Объект страницы, созданный с помощью функции create() веб-страницы phantom ', выглядит так, как только он передал URL-адрес:

phantom returned page

В то время как мой в моем node script выглядит следующим образом:

my page

Можно ли жестко закодировать свойства для достижения формата A4? Какие свойства мне не хватает?

Я так близко!

4b9b3361

Ответ 1

Это должно быть что-то вроде:

var phantom=require('../node-phantom');
phantom.create(function(error,ph){
  ph.createPage(function(err,page){
    page.open(url ,function(err,status){
      // do something
    });
  });
});

Ваше замешательство здесь связано с тем, что вы хотите повторно использовать те же концепции и метафоры с вашего PhantomJS script. Это не работает. Я предлагаю вам потратить некоторое время на изучение включенных тестов node - phantom, см. https://github.com/alexscheelmeyer/node-phantom/tree/master/test.

Ответ 2

Использование https://github.com/sgentle/phantomjs-node Я сделал страницу A4 в nodejs с помощью phantom со следующим кодом:

phantom.create(function(ph){
    ph.createPage(function(page) {
        page.set("paperSize", { format: "A4", orientation: 'portrait', margin: '1cm' });
        page.open("http://www.google.com", function(status) {
            page.render("google.pdf", function(){
                console.log("page rendered");
                ph.exit();
            })
        })
    })

});

Боковое примечание:

Функция page.set() принимает любую переменную, которую вы установили бы в примере rasterize.js. Посмотрите, как PaperSize установлен выше, и сравните его с соответствующими строками в файле rasterize.js