17

我正在尝试将 PhantomJS 脚本包装在 node.js 进程中。幻影脚本从命令行提供的参数中获取一个 url 并输出一个 pdf(非常类似于 pahntom 安装中包含的 rasterize.js 示例)。

我拥有的幻影脚本运行良好,如果可能的话,只是我的雇主想要一个节点脚本。没问题,我可以使用node-phantom节点模块来包装它。

但现在我遇到了一个绊脚石,我的幻影脚本有:

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

因此,node.js 试图找到一个名为“webpage”的模块,“webpage”模块内置于幻像安装中,因此节点无法找到它。据我所知,没有名为“网页”的 npm 模块。

“网页”是这样使用的:

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,而 output 是另一个参数,即文件的名称和类型。

谁能帮我吗?这是一个相当抽象的问题,所以说实话,我并不期待太多,但值得一试。

谢谢。

编辑 - 大约 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);
                }

            });

        });
    }
});

但!这不是正确的尺寸!使用 phantom 'webpage' create() 函数创建的页面对象在传递 URL 之前如下所示:

幻影返回页面

而我在我的节点脚本中,看起来像这样:

我的页面

是否可以对属性进行硬编码以实现 A4 格式?我缺少什么属性?

我好近!

4

2 回答 2

14

It should be something like:

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

Your confusion here is because you want to reuse the same concepts and metaphors from your PhantomJS script. It does not work that way. I suggest that you spend some time studying the included tests of node-phantom, see https://github.com/alexscheelmeyer/node-phantom/tree/master/test.

于 2012-10-18T14:57:49.910 回答
6

使用https://github.com/sgentle/phantomjs-node我在 nodejs 中使用 phantom 制作了一个 A4 页面,代码如下:

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 中的相关行进行比较

于 2014-02-24T22:55:19.100 回答