2009-10-01 6 views
23

¿Hay alguna herramienta gratuita que pueda leer una página web determinada y hacer una captura de pantalla de la misma?Tome una captura de pantalla de una página web en Java

+0

¿Va a disparar un navegador, abrir la página y capturarlo? el sitio web o ¿le gustaría que el sitio web se represente mediante el código java y que se escriba en la imagen? – quosoo

Respuesta

12

para construir sobre dos de las respuestas anteriores:

haciendo que el HTML en Java a continuación, guardar a una imagen - Unos pocos HTML basado en Java hace que existe, todos con diferentes conjuntos de inconvenientes. El más común es el que built in. Esto es bastante simple y solo puede renderizar HTML bastante básico. Lo más interesante que conozco es The Flying Saucer Project. Esto puede hacer que XHTML sea bastante complejo, pero deberá convertir HTML antes de poder usarlo (JTindy puede ayudar aquí). Tomar un componente Swing y crear una imagen es bastante simple, solo debe pasar un objeto BufferedImage s graphics y pasarlo al método Swing Components paint. Luego splatándolo con ImageIO.
Una gran ventaja de esto sería que el renderizador sería sin cabeza. La desventaja es que no sería un renderizado perfecto y carecería de complementos.

La segunda opción requiere para iniciar un navegador web, hacer ejercicio en el que es y luego tomar una captura de pantalla. Opcionalmente, es posible que también desee quitar todos los menús de Firefox/IE/Opera/etc. dejándolo con solo una imagen. Para obtener las dimensiones del navegador web, la opción más simple sería iniciarlo en pantalla completa. La otra opción sería usar algo como el componente JDICs browser para incluirlo como parte de la aplicación Java. Luego, podría especificar dónde se está renderizando HTML en la pantalla y luego simplemente usar Robot para crear una captura de pantalla de esa área.
La gran ventaja de esto es que proporcionará una representación perfecta (para un navegador determinado). Las dos desventajas es que requeriría un código nativo (o al menos el uso de un componente nativo) y no podría ser sin cabeza¹.

1) Puede utilizar un búfer de cuadros virtuales. Pero eso está fuera de Java.

+1

Hay un navegador en Eclipse. ¿Has experimentado con eso? –

+0

Aparte de como usuario no lo he hecho (las API de SWT me asustan). Pero un buen punto, eso es probablemente mejor que el predefinido integrado y mejor soporte HTML que Flying Saucer. –

+0

JTidy solo recientemente ha visto contribuciones recientes. También puede probar HtmlUnit (.sourceforge.net). +1 para la referencia del navegador JDIC, ​​es un proyecto realmente ambicioso y necesita más apoyo. –

2

Usted puede utilizar el método createScreenCapture en awt.Robot. Este método le permite especificar qué parte de la pantalla capturar. Por lo tanto, aún deberá determinar las coordenadas de la ventana que contiene la página web que desea capturar.

1

Para hacer que el HTML en Java puro, que puede echar un vistazo a platillo volante.

http://code.google.com/p/flying-saucer//

Se hace XML/XHTML/CSS 2.1

creo que sólo funciona en XML válido o XHTML, por lo que si usted necesita para representar HTML no válido, utilice una herramienta como neko para limpiar arriba antes de pasarlo al platillo volante.

18

que tuvieron mejores resultados con selenio WebDriver utilizando un VirtualFramebuffer y Firefox binario. Esto se prueba bajo ubuntu. Es necesario tener instalado Firefox y XVFB

Primero instale Firefox y uso de este dispositivo virtual:

aptitude install xvfb firefox 

compilar y ejecutar esta clase, /tmp/screenshot.png abierta después

import java.io.File; 
import java.io.IOException; 

import org.apache.commons.io.FileUtils; 
import org.openqa.selenium.OutputType; 
import org.openqa.selenium.TakesScreenshot; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxBinary; 
import org.openqa.selenium.firefox.FirefoxDriver; 

public class CaptureScreenshotTest 
{ 
    private static int  DISPLAY_NUMBER = 99; 
    private static String XVFB   = "/usr/bin/Xvfb"; 
    private static String XVFB_COMMAND = XVFB + " :" + DISPLAY_NUMBER; 
    private static String URL    = "http://www.google.com/"; 
    private static String RESULT_FILENAME = "/tmp/screenshot.png"; 

    public static void main (String[] args) throws IOException 
    { 
     Process p = Runtime.getRuntime().exec(XVFB_COMMAND); 
     FirefoxBinary firefox = new FirefoxBinary(); 
     firefox.setEnvironmentProperty("DISPLAY", ":" + DISPLAY_NUMBER); 
     WebDriver driver = new FirefoxDriver(firefox, null); 
     driver.get(URL); 
     File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); 
     FileUtils.copyFile(scrFile, new File(RESULT_FILENAME)); 
     driver.close(); 
     p.destroy(); 
    } 
} 
+0

Puedo confirmar que esto funciona excelentemente (mac OS) –

+0

yeap, pero use/usr/X11/bin/xvfb – z0mb1ek

+0

@janning ¿Es posible obtener URL de la ventana actual seleccionada usando Java? Bcoz mi página web tiene pestañas múltiples y cada Cuando hago clic en cada una de las pestañas, la URL correspondiente debe pasarse como campo de URL – chopss

6

No es Java , pero después de venir aquí, es lo que terminé usando, así que creo que vale la pena mencionarlo.Con PhantomJs puede ejecutar una versión sin cabeza de webkit, y luego acceder a la funcionalidad a través de un servidor web de mangosta integrado, que puede manejar las solicitudes de capturas de pantalla, y almacenarlas localmente. Puede usar Java para realizar la solicitud, y la respuesta puede tener la URL de la imagen en el servidor, para que también pueda tomar eso:

Cuestiones relacionadas