页脚的内容似乎不起作用[英] Footer's contents don't seem to work

问题描述

我正在尝试在 phantomjs 示例中创建自定义页脚:https://github.com/ariya/phantomjs/blob/master/examples/printheaderfooter.js

这是我的代码:

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不暴露回调方法是不是bug?

推荐答案

你的脚本有两个问题:

  • 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.这允许我们重新插入页眉/页脚 .contents.

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;

如您所见,这很有效!(谷歌法语)

在此处输入图片描述

本文地址:https://www.itbaoku.cn/post/1740066.html