2013-06-14 5 views
3

Я пытаюсь создать пользовательские колонтитулы, например, в примерах phantomjs: https://github.com/ariya/phantomjs/blob/master/examples/printheaderfooter.jsFOOTER не кажется работать

Вот мой код:

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

Но, к сожалению, я получаю следующее сообщение об ошибке:

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

Является ли ошибка, что ph не предоставляет метод обратного вызова?

ответ

0

узел фантом кажется разоблачить этот прокси-объект с помощью функции создания (это должно быть вашим фот-объект):

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

, что означает, что вы можете, вероятно, Acces фантомы обратного вызова, как это:

ph._phantom.callback 
+0

К сожалению, я получаю следующее сообщение об ошибке: Caught exception: TypeError: Object # не имеет метода 'callback'; – Erik

+0

чем я сожалею, тогда я не вижу, как я могу вам помочь – hereandnow78

0

Вот что я сделал, чтобы получить доступ к phantom.callback:

добавить это узел-phantom.js линии 202:

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

непосредственно перед _phantom: phantom

и добавить к bridge.js линии 45:

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

Надеется, что это помогает!

+0

Это решение работает для вас? Я добавил код выше, и теперь я не получаю ошибку, но у меня тоже нет нижнего колонтитула. Вы уверены, что этого достаточно? – Erik

+0

Я просто показал вам, как получить доступ к объекту phantom.callback, а не ко всем решениям ... «Хороший вопрос: следует ли использовать phantomjs с node.js?» Удивительный вопрос #Cybermaxs - Betclic – rafaelcastrocouto

6

Есть две проблемы в вашем скрипте:

  • ph не является классическим объектом фантом, но прокси-объект. node-phantom использовать веб-сокеты для вызова phantomjs. Конечно, некоторые функции теряются с использованием этой реализации.
  • функция не сериализованная при вызове page.set

Печати на заказ верхний/нижний колонтитул также требует, чтобы позвонить phantom.callback. Этот метод не документирован и поэтому не отображается node-phantom (и не может быть). Нам нужно найти способ применения этого метода в этом пакете.

Существует множество решений. Вот мое возможное решение:

сериализации функции в строке в сценарии

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

редактировать bridge.js и добавить phantom.callback + Eval. Это позволяет нам повторно подключить содержимое верхнего/нижнего колонтитула.

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; 

Как вы можете видеть, это работает! (Google по-французски)

enter image description here

+0

Спасибо. Это прекрасно работает. Конечно, я дам вам щедрость. Могу ли я спросить вас по поводу вопроса. Что вы думаете об этом мосте (я имею в виду узел-фантом) для фантомов? Это взлом или хорошее решение для работы с phantomjs в nodejs? – Erik

+0

хорошо, хороший вопрос: следует ли использовать phantomjs с node.js? Существует хороший ответ на http://stackoverflow.com/questions/15745394/can-phantomjs-work-with-node-js, особенно «Phantom и node имеют непримиримые различия». Personnaly Я не большой поклонник, но когда-то мы должны делать плохие вещи только для того, чтобы выполнить работу. – Cybermaxs

+0

@ Cybermaxs, он отлично работает, как мы можем получить общее количество страниц? Http: //stackoverflow.com/questions/23516294/node-phantom-show-number-of-generated-pdf-pages –

1

К сожалению, node-phantom не появляется для поддержки phantom.callback. Поскольку проект неактивен более года, я думаю, что он вряд ли будет обновлен в ближайшем будущем.

С другой стороны, phantomjs-node поддерживает phantom.callback() с версии 0.6.6. Вы можете использовать его как это:

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

Как вы можете видеть на this gist.

+1

Я больше не использую модуль 'node-phantom' и лучше нахожу https://github.com/peerigon/phridge – Erik

+0

Эрик, спасибо большое. Phridge * значительно проще, чем другие – kibibu

Смежные вопросы