3 votes

Le contenu du pied de page ne semble pas fonctionner

J'essaie de créer des pieds de page personnalisés comme dans les exemples de phantomjs : https://github.com/ariya/phantomjs/blob/master/examples/printheaderfooter.js

Voici mon code :

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

phantom.create(function (err, ph) {
    ph.createPage(function (err, page) {
         page.set('paperSize', {
              format: 'A4',
              orientation: 'portrait',
              footer: {
                contents: ph.callback(function (pageNum, numPages) {
                  if (pageNum == 1) {
                    return "";
                  }
                  return "<h1>Header <span style='float:right'>" + pageNum + " / " + numPages + "</span></h1>";
                })
              }
         }, function () {
             page.open('http://www.google.com', function () {
              })
         })
    })
});

Mais malheureusement, j'obtiens l'erreur suivante :

TypeError: Object #<Object> has no method 'callback';

Est-ce un bogue que ph n'expose pas la méthode de rappel ?

6voto

Cybermaxs Points 12146

Il y a deux problèmes dans votre script :

  • ph n'est pas l'objet fantôme classique, mais un objet proxy. node-phantom utiliser des sockets web pour invoquer phantomjs. Bien sûr, certaines fonctionnalités sont perdues en utilisant cette implémentation.
  • ne sont pas sérialisées lors de l'appel des fonctions page.set

L'impression d'un en-tête/pied de page personnalisé nécessite également d'appeler phantom.callback. Cette méthode n'est pas documentée et n'est donc pas exposée par l'application node-phantom (et ne peut pas l'être). Nous devons trouver un moyen d'appliquer cette méthode dans ce paquet.

Il existe de nombreuses solutions. Voici la solution que je propose :

Sérialisez vos fonctions dans une chaîne de caractères dans votre script.

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

phantom.create(function (err, ph) {
    ph.createPage(function (err, page) {
         page.set('paperSize', {
              format: 'A4',
              orientation: 'portrait',
              header: {
                            height: "1cm",
                            contents: 'function(pageNum, numPages) { return pageNum + "/" + numPages; }'
                        },
                        footer: {
                            height: "1cm",
                            contents: 'function(pageNum, numPages) { return pageNum + "/" + numPages; }'
                        }
         }, function () {   
             page.open('http://www.google.fr', function () {        
             page.render('google.pdf');
             ph.exit();
              })
         })
    })
});

modifier bridge.js et ajouter phantom.callback + eval. Cela nous permet de rebrancher le contenu du header/footer.

case 'pageSet':
            eval('request[4].header.contents = phantom.callback('+request[4].header.contents+')');
            eval('request[4].footer.contents = phantom.callback('+request[4].footer.contents+')');
            page[request[3]]=request[4];
            respond([id,cmdId,'pageSetDone']);
            break;

Comme vous pouvez le constater, cela fonctionne ! (Google en français)

enter image description here

1voto

Ricardo Torres Points 83

Malheureusement, nœud-phantom ne semble pas supporter phantom.callback . Le projet étant inactif depuis plus d'un an, je pense qu'il est peu probable qu'il soit mis à jour dans un avenir proche.

D'un autre côté, phantomjs-node soutient phantom.callback() depuis la version 0.6.6 . Vous pouvez l'utiliser comme ceci :

var phantom = require('phantom');

phantom.create(function (ph) {
    ph.createPage(function (page) {
        page.open("http://www.google.com", function (status) {

            var paperConfig = {
                format: 'A4',
                orientation: 'portrait',
                border: '1cm',
                header: {
                    height: '1cm',
                    contents: ph.callback(function(pageNum, numPages) {
                        return '<h1>My Custom Header</h1>';
                    })
                },
                footer: {
                    height: '1cm',
                    contents: ph.callback(function(pageNum, numPages) {
                        return '<p>Page ' + pageNum + ' / ' + numPages + '</p>';
                    })
                }
            };

            page.set('paperSize', paperConfig, function() {
                // render to pdf
                page.render('path/to/file.pdf', function() {
                    page.close();
                    ph.exit();
                });
            });
        });
    });
});

Comme vous pouvez également le voir sur cette phrase .

0voto

hereandnow78 Points 4914

Le nœud fantôme semble exposer ce proxy-objet via la fonction create (ce devrait être votre ph-objet) :

var proxy={
                createPage:function(callback){
                    request(socket,[0,'createPage'],callbackOrDummy(callback));
                },
                injectJs:function(filename,callback){
                    request(socket,[0,'injectJs',filename],callbackOrDummy(callback));
                },
                addCookie: function(cookie, callback){
                    request(socket,[0,'addCookie', cookie],callbackOrDummy(callback));
                },
                exit:function(callback){
                    request(socket,[0,'exit'],callbackOrDummy(callback));
                },
                on: function(){
                    phantom.on.apply(phantom, arguments);
                },
                _phantom: phantom
            };

cela signifie que vous pouvez probablement accéder au callback des fantômes comme ceci :

ph._phantom.callback

0voto

rafaelcastrocouto Points 2931

Voici ce que j'ai fait pour accéder à phantom.callback :

ajoutez ceci à node-phantom.js ligne 202 :

callback: function(callback){
  request(socket,[0,'callback'],callbackOrDummy(callback));
},

juste avant _phantom: phantom

et ajoutez ceci à bridge.js ligne 45 :

case 'callback':
    phantom.callback(request[3]);
break;

J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X