2013-02-01 15 views
19

PhantomJS sta facendo un ottimo lavoro nel catturare pagine Web in file di immagine per me. Sto usando uno script basato su rasterize.js.Ritagliare l'acquisizione dello schermo PhantomJS in base al contenuto

Tuttavia, per alcuni elementi Web di dimensioni fisse, ho bisogno che l'immagine risultante corrisponda alla dimensione dell'elemento web.

ad es. Ho una pagina come questa:

<html> 
<body> 
    <div id="wrapper" style="width:600px; height:400px;"> 
     Content goes here... 
    </div> 
</body> 
</html> 

In questo esempio, ho bisogno di produrre un'immagine di dimensioni a 600x400. È un modo per ottenere dinamicamente la dimensione della vista in base a un elemento Web nella pagina che sto rasterizzando.

So che questo non è facile ... Idee?

Grazie

risposta

23

Wow. Non è poi così difficile. Basta impostare il viewport davvero grande e utilizzare la funzione cropRect. Che grande strumento!

Mods a rasterize.js:

page.open(address, function (status) { 
    if (status !== 'success') { 
     console.log('Unable to load the address!'); 
    } else { 
     var height = page.evaluate(function(){ 
      return document.getElementById('wrapper').offsetHeight; 
     }); 
     var width = page.evaluate(function(){ 
      return document.getElementById('wrapper').offsetWidth; 
     }); 
     console.log('Crop to: '+width+"x"+height); 

     page.clipRect = { top: 0, left: 0, width: width, height: height }; 
     window.setTimeout(function() { 
      page.render(output); 
      phantom.exit(); 
     }, 200); 
    } 
}); 
+2

A tutti coloro che trova il loro modo qui su una ricerca per il perfetto PDF - clipRect è soltanto per le immagini in questo momento (anche se non lo dice esplicitamente che nel documentazione). C'è un bug archiviato. – Chords

+3

perché stai usando window.settimeout per il rendering? – user20358

+2

Se la pagina mostra contenuti con animazioni, ecc. È necessario il timeout per garantire che tutti gli elementi siano visibili. – Mika

Problemi correlati