Pregunta Uso del módulo fantasma 'página web' en node.js


Estoy tratando de ajustar un script PhantomJS en un proceso node.js. La secuencia de comandos fantasma toma una URL de los argumentos proporcionados en la línea de comandos y genera un pdf (muy similar al ejemplo rasterize.js incluido con la instalación de pahntom).

El script fantasma que tengo funciona bien, solo que mi jefe quiere un script de nodo si es posible. No hay problema, puedo usar el node-phantom módulo de nodo para envolverlo.

Pero ahora he topado con un obstáculo, mi guión fantasma tiene:

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

Entonces, node.js está tratando de encontrar un módulo llamado 'página web', el módulo 'página web' está integrado en la instalación fantasma, por lo que el nodo no puede encontrarlo. Por lo que puedo decir, no hay un módulo npm llamado 'página web'.

'página web' se usa así:

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);
    }
});

donde la dirección es la url especificada en la línea de comando y la salida es otro argumento, el nombre y el tipo del archivo.

¿Puede alguien ayudarme? Esto es bastante abstracto, así que no espero mucho si soy sincero, vale la pena intentarlo.

Gracias.

EDITAR - Aproximadamente 2 horas después

Ahora tengo esto que arroja un 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);
                }

            });

        });
    }
});

¡Pero! ¡No es del tamaño correcto! El objeto de página creado con la función fantasma 'página web' create () se ve así antes de pasar la URL:

phantom returned page

Mientras que el mío en mi script de nodo, se ve así:

my page

¿Es posible codificar las propiedades para obtener formato A4? ¿Qué propiedades me estoy perdiendo?

¡Estoy tan cerca!


14
2017-10-18 14:40


origen


Respuestas:


Debería ser algo así como:

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

Su confusión aquí es porque quiere reutilizar los mismos conceptos y metáforas de su script PhantomJS. No funciona de esa manera. Sugiero que pases algún tiempo estudiando las pruebas incluidas de nodo-fantasma, mira https://github.com/alexscheelmeyer/node-phantom/tree/master/test.


13
2017-10-18 14:57



Utilizando https://github.com/sgentle/phantomjs-node He hecho una página A4 en nodejs usando fantasma con el siguiente código:

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();
            })
        })
    })

});

Nota al costado:

la función page.set () toma cualquier variable que establezca en el ejemplo rasterize.js. Vea cómo se establece paperSize arriba y compárelo con las líneas relevantes en rasterize.js


6
2018-02-24 22:55