PhantomJSスクリプトをnode.jsプロセスでラップしようとしています。ファントムスクリプトは、コマンドラインで提供された引数からURLを取得し、pdfを出力します(pahntomインストールに含まれているrasterize.jsの例とよく似ています)。
私が使用しているファントムスクリプトは問題なく動作します。雇用主が可能であればノードスクリプトを望んでいるだけです。問題ありません node-phantom nodeモジュールを使用してラップできます。
しかし、今、障害にぶつかりました。私の幻のスクリプトは次のとおりです。
var page = require('webpage').create();
したがって、node.jsは「webpage」というモジュールを見つけようとします。「webpage」モジュールはファントムインストールに組み込まれているため、ノードはそれを見つけることができません。私の知る限り、「webpage」というnpmモジュールはありません。
'webpage'は次のように使用されます:
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);
}
});
});
}
});
だが!それは適切なサイズではありません!ファントムの 'webpage' create()関数を使用して作成されたページオブジェクトは、URLが渡される前は次のようになります。
私のノードスクリプトでは、次のようになります。
プロパティをハードコーディングしてA4フォーマットを実現することは可能ですか?どのプロパティが欠けていますか?
私はとても近いです!
それは次のようなものでなければなりません:
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 を参照してください。
使用して https://github.com/sgentle/phantomjs-node 私はphantomを使用して次のコードで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の関連する行と比較してください。