17

PhantomJSスクリプトをnode.jsプロセスでラップしようとしています。ファントムスクリプトは、コマンドラインで提供された引数からURLを取得し、PDFを出力します(pahntomインストールに含まれているrasterize.jsの例とよく似ています)。

私が持っているファントムスクリプトは正常に機能します。可能であれば、雇用主がノードスクリプトを望んでいるだけです。問題ありません。ノードファントムノードモジュールを使用してラップできます。

しかし今、私はつまずきにぶつかりました。私のファントムスクリプトには次のようなものがあります。

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

そのため、node.jsは「webpage」というモジュールを見つけようとしています。「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であり、出力は別の引数、ファイルの名前とタイプです。

誰かが私を助けることができますか?これはかなり抽象的なものなので、正直なところ、試してみる価値はありますが、あまり期待していません。

ありがとう。

編集-約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);
                }

            });

        });
    }
});

だが!適切なサイズではありません!ファントム'webpage'create()関数を使用して作成されたページオブジェクトは、URLが渡される前は次のようになります。

ファントムが返されたページ

私のノードスクリプトでは、次のようになっています。

私のページ

A4フォーマットを実現するためにプロパティをハードコーディングすることは可能ですか?不足しているプロパティは何ですか?

私はとても近いです!

4

2 に答える 2

14

次のようになります。

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

ここで混乱しているのは、PhantomJS スクリプトから同じ概念とメタファーを再利用したいからです。そのようには機能しません。node-phantom に含まれているテストについて、時間をかけて勉強することをお勧めします。https://github.com/alexscheelmeyer/node-phantom/tree/master/testを参照してください。

于 2012-10-18T14:57:49.910 に答える
6

https://github.com/sgentle/phantomjs-nodeを使用して、次のコードでファントムを使用して nodejs で 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 に答える