2012-10-18 12 views
14

Bir node.js işleminde bir PhantomJS komut dosyasını sarmaya çalışıyorum. Fantom betiği komut satırında sağlanan argümanlardan bir URL alır ve bir pdf çıkarır (pahntom kurulumunda bulunan rasterize.js örneğine çok benzer).node.js 'web sayfası' Phantom modülünü kullanma

Elimde çalıştığım phantom betiği iyi çalışıyor, sadece işverenim mümkünse bir düğüm komutunu istiyor. Sorun değil, sarmak için node-phantom düğüm modülünü kullanabilirim.

Ama şimdi bir engel isabet ettik benim fantom komut vardır: Yani

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

, 'web sayfası' adlı bir modül bulmaya çalışıyor node.js, 'web sayfası' modülü yerleşik hayalet yükleme, böylece düğüm onu ​​bulamıyor. Anlayabildiğim kadarıyla 'web sayfası' diye adlandırılan npm modülü yok.

'web sayfası' böyle kullanılır: adres komut satırında ve çıkış belirtilen url'dir

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

başka argüman, isim ve dosyanın türüdür.

Herkes bana yardımcı olabilir mi? Bu oldukça soyut bir tanesidir, bu yüzden dürüst olsam bile denemeye değer değilim.

Teşekkürler.

DÜZENLEME - Yaklaşık 2 saat şimdi bu var sonra

PDF dışarı atar:

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

      }); 

     }); 
    } 
}); 

Ama! Doğru boyut değil! Benim düğüm komut mayın Oysa

phantom returned page

şöyle::

my page

sayfa nesne hayali 'web sayfası' oluşturmak() o URL'yi geçirilen önce fonksiyon şöyle kullanılarak oluşturulan

A4 formatına ulaşmak için özellikleri kodlamak mümkün mü? Hangi mülkler eksik?

Çok yakınım! Eğer PhantomJS komut aynı kavram ve metaforları yeniden kullanmak istiyorsanız, çünkü burada

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

Sizin karışıklık geçerli:

+0

Bu Adam'la bir yere varacak mısın? Merak ediyorum. –

+0

Ne yazık ki sonunda değil. Takımımı iyi çalıştıran fantom sürecini kullanmaya ikna ettim. –

+0

Merak etme, son iki ekran görüntüsünde hangi araç kullanılıyor? –

cevap

11

Bu gibi bir şey olmalıdır. Bu şekilde çalışmıyor. Ben de dahil olmak üzere node-fantom testlerini incelemek için biraz zaman harcamanızı öneririm, bkz. 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(); 
      }) 
     }) 
    }) 

}); 

Yan Not:

page.set() işlevi belirlenen herhangi bir değişkeni alır Aşağıdaki kod ile fantom kullanılarak nodejs bir A4 sayfasını yaptık https://github.com/sgentle/phantomjs-node kullanma

+1

teşekkürler. Phantom'un yaratıcısının cevap verdiğine inanamıyorum :). Bunu yapmak için çok yakınım. Şimdi bir PDF çıktısı alıyorum, ancak doğru boyutta değil (A4). 'Web sayfası', tüm ayarları aldığından ve bunları sayfa varlığında sakladığından ph.createPage (işlev (err, page) yerine 'webpage' öğesinden export() olarak verilen decorateNewPage (opts, page) işlevini kullanmam gerekir. Bu mümkün mü? –

+0

Sorunun cevabını kontrol edin, çok yakınım ama çatlayamıyorum –

5

rasterize.js örneği. PaperSize'in nasıl ayarlandığını görün ve rasterleştirmeyle ilgili satırlarla karşılaştırın.js

+0

['phantomjs-prebuilt'] ile nasıl çalışır (https://www.npmjs.com/package/ phantomjs)? – Rayon

+0

@Rayon https://github.com/rknell/url2pdf yapımını tamamladığım bu modüle bir göz atıyorum. Büyük bir proje için çok yakın bir zamanda üretildim ve oldukça katı bir yapıya kavuştum. Görselleri kullanıyorsanız PDF dönüştürme –