2012-10-18 19 views
14

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

私が使っているファントムスクリプトはうまくいきます。私の雇用主は、可能であれば、ノードスクリプトを望んでいます。問題ないですが、node-phantomノードモジュールを使用してラップすることができます。

しかし、今、私はつまずきを打ってきました、私のファントムスクリプトがありますので、

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

、「Webページ」と呼ばれるモジュールを検索しようとしているのNode.js、「Webページ」モジュールを内蔵されましたファンタムはノードがそれを見つけることができないようにインストールします。私が知る限り、「ウェブページ」と呼ばれるnpmモジュールはありません。

「Webページ」はこのように使用されます。アドレスは、コマンドラインと出力に指定されたURLである

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

は別の引数、名前とファイルの種類です。

誰でもお手伝いできますか?これはかなり抽象的なものなので、私は正直であればそれほど期待はしていないが、試してみる価値がある。

ありがとうございました。

EDIT - 約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 returned page

次のようになります:

my page

ページオブジェクトは、ファントム「Webページ」を作成()関数は、それがURLを渡される前、このようになります使用して作成しました

A4フォーマットを実現するためにプロパティをハードコードすることはできますか?どのような特性がありますか?

私はとても近いです!

+0

このAdamはどこにでもありますか?私は興味がある。 –

+0

残念ながら最後にはありません。私は代わりにファントムプロセスを使用するように私のチームを説得しました。 –

+0

好奇心のために、最後の2つのスクリーンショットでどのツールが使用されていますか? –

答えて

11

それはのようなものでなければなりません:あなたはPhantomJSスクリプトから同じ概念とメタファーを再利用したいので

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

ここにあなたの混乱があります。そのようには機能しません。私はノードファントムに含まれているテストを勉強するのに少し時間を費やすことをお勧めします。https://github.com/alexscheelmeyer/node-phantom/tree/master/testを参照してください。

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()関数は、あなたが設定する任意の変数を取り、私は次のコードでファントムを用いnodejsでA4ページを作ってきたhttps://github.com/sgentle/phantomjs-nodeを使用して

+1

答えに感謝します。ファントムの作成者が答えたとは信じられません:)。私はこれを釘付けに近づいている。私は今PDF出力を取得していますが、正しいサイズではありません(A4)。 'webpage'はすべての設定を受け取り、それらをページvarに保存するため、ph.createPage(function(err、page))ではなく、 'webpage'からcreate()としてエクスポートされたdecorateNewPage(opts、page)これは可能ですか? –

+0

質問に私の更新をチェックしてください、私は非常に近いですが、それを解読することはできません –

5

rasterize.jsの例上にpaperSizeがどのように設定されているかを見て、それをラスタライズの関連する線と比較してください。js

+0

['phantomjs-prebuilt']でこれをどうやって行うのですか?(https://www.npmjs.com/package/ phantomjs)? – Rayon

+0

@Rayonこのモジュールをチェックアウトしました。私はhttps://github.com/rknell/url2pdfを作成しました。私は最近、大きなプロジェクトのためにプロダクションで使用されていました。イメージを使用している場合のPDF変換 –

関連する問題