2012-10-18 16 views
14

Ich versuche, ein PhantomJS-Skript in einem node.js-Prozess zu umbrechen. Das Phantomscript erfasst eine URL aus den Argumenten, die in der Befehlszeile angegeben sind, und gibt eine PDF-Datei aus (ähnlich wie beim Beispiel "Rasterize.js", das in der Panthom-Installation enthalten ist).Verwenden der 'Webseite' Phantom-Modul in node.js

Das Phantom-Skript Ich habe funktioniert gut, es ist nur mein Arbeitgeber will ein Node-Skript, wenn möglich. Kein Problem, ich kann das node-phantom Knotenmodul verwenden, um es zu wickeln.

Aber jetzt habe ich einen Stein des Anstoßes getroffen, mein Phantom Skript hat:

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

So node.js versucht, ein Modul aufgerufen zu finden ‚Webseite‘, die ‚Webseite‘ Modul eingebaut in Die Phantom-Installation, damit der Knoten sie nicht finden kann. Soweit ich das beurteilen kann, gibt es kein npm-Modul namens "Webseite".

‚Homepage‘ wird wie folgt verwendet:

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

wo Adresse die URL auf der Kommandozeile und Ausgang ist ein weiteres Argument, den Namen und den Typ der Datei angegeben ist.

Kann mir jemand helfen? Das ist ziemlich abstrakt, also erwarte ich nicht viel, wenn ich ehrlich bin, aber einen Versuch wert.

Danke.

EDIT - ca. 2 Stunden später

ich das jetzt haben, die eine PDF wirft:

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

      }); 

     }); 
    } 
}); 

Aber! Es ist nicht die richtige Größe! Die Seite Objekt erstellt das Phantom 'Homepage' mit create() Funktion sieht wie folgt aus, bevor es die URL übergeben wird:

phantom returned page

Während Mine in meinem Knoten Skript, sieht wie folgt aus:

my page

Ist es möglich, die Eigenschaften hart zu codieren, um A4-Formatierung zu erreichen? Welche Eigenschaften fehlt mir?

Ich bin so nah!

+0

Sie kommen überall mit diesem Adam? Ich bin neugierig. –

+0

Leider nicht am Ende. Ich überredete mein Team, stattdessen den Phantomprozess zu verwenden, was gut funktionierte. –

+0

Aus Neugier, welches Tool wird in den letzten zwei Screenshots verwendet? –

Antwort

11

sollte es sein, so etwas wie:

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

Ihre Verwirrung hier ist, weil Sie die gleichen Konzepte und Metaphern aus Ihrem PhantomJS Skript wiederverwenden möchten. Es funktioniert nicht so. Ich schlage vor, dass Sie einige Zeit damit verbringen, die eingeschlossenen Tests des Knotenphantoms zu studieren, siehe https://github.com/alexscheelmeyer/node-phantom/tree/master/test.

+1

danke für die Antwort. Ich kann nicht glauben, dass der Schöpfer von Phantom antwortete :). Ich bin so nah dran, das zu nageln. Ich bekomme jetzt eine PDF-Ausgabe, aber es ist nicht die richtige Größe (A4). Ich muss die Funktion decorateNewPage (opts, page) verwenden, die als create() von 'webpage' anstelle von ph.createPage (function (err, page) exportiert wurde, weil 'webpage' alle Einstellungen empfängt und sie in der Seite var speichert. Ist das möglich? –

+0

Überprüfen Sie mein Update auf die Frage, ich bin sehr nah, aber kann es nicht knacken –

5

Mit https://github.com/sgentle/phantomjs-node ich eine A4-Seite in NodeJS mit dem folgenden Code Phantom gemacht habe:

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

}); 

Side Hinweis:

die page.set() -Funktion nimmt jede Variable, die Sie setzen würden in Das Beispiel rasterize.js. Sehen Sie, wie paperSize oben eingestellt ist, und vergleichen Sie sie mit den relevanten Zeilen in Rasterize.js

+0

Wie man dies mit ['phantomjs-prebuilt'] (https://www.npmjs.com/package/ phantomjs)? – Rayon

+0

@Rayon Check out dieses Modul Ich landete machen https://github.com/rknell/url2pdf Ich wurde vor kurzem in der Produktion für ein großes Projekt verwendet und war ziemlich solide, nur weg von der direkten HTML zu bleiben PDF-Konvertierung, wenn Sie Bilder verwenden –