Tome una captura de pantalla de una página web en Java

¿Hay alguna herramienta gratuita que pueda leer una página web determinada y hacer una captura de pantalla de ella?

Para construir sobre dos de las respuestas anteriores:

Renderizar el HTML en Java y luego guardarlo en una imagen: existen algunos renderizados HTML basados ​​en Java, todos con diferentes conjuntos de inconvenientes. El más común es el que está incorporado . 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, simplemente pasa el objeto gráfico de BufferedImage y lo pasa al método de pintura de componentes Swing. Luego splat eso con ImageIO .
Una gran ventaja de esto sería que el procesador no tendría cabeza. La desventaja es que no sería un renderizado perfecto y carecería de complementos.

La segunda opción requiere que inicies un navegador web, resuelves dónde está y luego tomas 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 del navegador JDIC para incluirlo como parte de la aplicación Java. Luego, podría especificar dónde se está renderizando el 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) Podría usar un buffer de marco virtual. Pero eso está fuera de Java.

Obtuve mejores resultados con Selenium Webdriver usando un VirtualFramebuffer y Firefox Binary. Esto se prueba bajo ubuntu. Debes tener instalado xvfb y firefox

Primero instale firefox y virtual framebuffer:

 aptitude install xvfb firefox 

Comstack y ejecuta esta clase, abre /tmp/screenshot.png luego

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

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 mongoose 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, de modo que pueda tomar eso también-

use selenium-rc

Puede usar 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.

Para renderizar el HTML en java puro, puede echarle un vistazo a Flying Saucer.

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

Hace XML / XHTML / CSS 2.1

Creo que solo funciona en XML o XHTML válidos, por lo que si necesita generar HTML no válido, use una herramienta como neko para limpiarlo antes de pasarlo a un platillo volante.