2011-09-23 6 views
10

Ho iniziato a utilizzare Phantom JS su Windows, ma sto riscontrando un po 'di difficoltà nel trovare documentazione sulla sua capacità (probabilmente la radice del mio problema).Utilizzo di Phantom JS per convertire tutti i file HTML in una cartella in PNG

Utilizzando Phantom JS vorrei fare quanto segue:

  1. dargli una cartella macchina locale,
  2. Averlo passare a quella posizione e identificare l'elenco dei file HTML,
  3. volta quella lista è identificata per il ciclo dell'elenco di file HTML e li converte tutti in PNG (simile al modo in cui funziona l'esempio rasterize.js), dove il nome del file gsubs "HTML" con "PNG".

Sono sicuro che questo è probabilmente possibile, ma non ero in grado di trovare la funzione di chiamata Phantom JS per:

  1. ottenere l'elenco dei file in una cartella e
  2. il formato per gsub e grep in Phantom JS.

risposta

18
var page = require('webpage').create(), loadInProgress = false, fs = require('fs'); 
var htmlFiles = new Array(); 
console.log(fs.workingDirectory); 
var curdir = fs.list(fs.workingDirectory); 

// loop through files and folders 
for(var i = 0; i< curdir.length; i++) 
{ 
    var fullpath = fs.workingDirectory + fs.separator + curdir[i]; 
    // check if item is a file 
    if(fs.isFile(fullpath)) 
    { 
     // check that file is html 
     if(fullpath.indexOf('.html') != -1) 
     { 
      // show full path of file 
      console.log('File path: ' + fullpath); 
      htmlFiles.push(fullpath); 
     } 
    } 
} 

console.log('Number of Html Files: ' + htmlFiles.length); 

// output pages as PNG 
var pageindex = 0; 

var interval = setInterval(function() { 
    if (!loadInProgress && pageindex < htmlFiles.length) { 
     console.log("image " + (pageindex + 1)); 
     page.open(htmlFiles[pageindex]); 
    } 
    if (pageindex == htmlFiles.length) { 
     console.log("image render complete!"); 
     phantom.exit(); 
    } 
}, 250); 

page.onLoadStarted = function() { 
    loadInProgress = true; 
    console.log('page ' + (pageindex + 1) + ' load started'); 
}; 

page.onLoadFinished = function() { 
    loadInProgress = false; 
    page.render("images/output" + (pageindex + 1) + ".png"); 
    console.log('page ' + (pageindex + 1) + ' load finished'); 
    pageindex++; 
} 

Spero che questo helps. Per ulteriori informazioni sulle chiamate FileSystem, controllare questa pagina: http://phantomjs.org/api/fs/

Inoltre, volevo aggiungere, che credo che le funzioni di FileSystem siano disponibili solo in PhantomJS 1.3 o versioni successive. Assicurati di eseguire la versione latest. Ho usato PyPhantomJS per Windows ma sono sicuro che funzionerà senza intoppi anche su altri sistemi.

+0

In qualche modo ottengo solo 'PNG's vuoti con il tuo script. Aggiunta di 'console.log (page.content);' in 'page.onLoadFinished' restituisce' 'non importa che il vero contenuto HTML sia ... Qualche suggerimento? Phantomjs v1.9.2 – AvL

+0

Sei sicuro che le tue pagine vengano caricate completamente prima che tu stia tentando di scattare istantanee? –

+0

Ho controllato anche per 'status'. Vedi la mia domanda: http://stackoverflow.com/questions/19939046/phantomjs-fails-to-open-local-file – AvL