web-dev-qa-db-fra.com

Faites une capture d'écran d'une page Web en Java

Existe-t-il un outil gratuit qui peut lire une page Web donnée et en prendre une capture d'écran?

25
mgamer

Pour tirer parti de deux des réponses ci-dessus:

Rendu du code HTML en Java puis enregistrement dans une image - Quelques rendus Java basés sur HTML existent, tous avec différents ensembles d'inconvénients. Le plus courant est celui intégré . C'est assez simple et ne peut rendre que du HTML assez basique. Le plus intéressant que je connaisse est The Flying Saucer Project . Cela peut rendre le XHTML assez complexe mais vous le ferez devez convertir du HTML avant de pouvoir l'utiliser ( JTindy peut être utile ici). Prendre un composant Swing et créer une image est assez simple, il vous suffit de passer un BufferedImage s graphiques objet et passez-le à la méthode des composants Swing Paint . Répartissez-le ensuite avec ImageIO .
Un gros avantage serait que le moteur de rendu serait sans tête. L'inconvénient est que ce ne serait pas un rendu parfait et qu'il manquerait de plugins.

La deuxième option vous oblige à démarrer un navigateur Web, à déterminer où il se trouve, puis à prendre une capture d'écran. En option, vous pouvez également souhaiter supprimer tous les menus de Firefox/IE/Opera/etc, vous laissant avec juste une image. Pour obtenir les dimensions du navigateur Web, l'option la plus simple serait de le démarrer en plein écran. L'autre option serait d'utiliser quelque chose comme le composant JDICs navigateur pour l'inclure dans le cadre de l'application Java. Il serait alors en mesure de spécifier où le HTML est en train d'être rendu à l'écran, puis utilisez simplement Robot pour créer une capture d'écran de cette zone.
Le gros avantage de ceci est qu'il donnera un rendu parfait (pour un navigateur donné). Les deux inconvénients sont qu'il nécessiterait du code natif (ou du moins l'utilisation d'un composant natif) et qu'il ne pourrait pas être sans tête¹.

1) Vous pouvez utiliser un tampon de trame virtuel. Mais c'est en dehors de Java.

16

J'ai eu les meilleurs résultats avec Selenium Webdriver en utilisant un VirtualFramebuffer et Firefox Binary. Ceci est testé sous ubuntu. Vous devez avoir installé xvfb et firefox

Installez d'abord Firefox et Framebuffer virtuel:

aptitude install xvfb firefox

Compilez et exécutez cette classe, ouvrez ensuite /tmp/screenshot.png

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

Ce n'est pas Java, mais après être venu ici, c'est ce que j'ai fini par utiliser, donc je pense que cela mérite d'être mentionné. Avec PhantomJs vous pouvez exécuter une version sans tête de webkit, puis accéder à la fonctionnalité via un serveur Web mangouste intégré, qui peut gérer les demandes de capture d'écran et les stocker localement. Vous pouvez utiliser Java pour faire la demande, et la réponse peut avoir l'URL de l'image sur le serveur, vous pouvez donc saisir cela aussi-

6
chrismarx

utiliser Selenium-rc

2
flybywire

Vous pouvez utiliser la méthode createScreenCapture dans awt.Robot. Cette méthode vous permet de spécifier la partie de l'écran à capturer. Ainsi, vous devrez toujours déterminer les coordonnées de la fenêtre qui contient la page Web que vous souhaitez capturer.

2
JZeeb

Pour rendre le HTML en Java pur, vous pouvez jeter un œil à Flying Saucer.

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

Il rend XML/XHTML/CSS 2.1

Je crois que cela ne fonctionne que sur du XML ou XHTML valide, donc si vous avez besoin de rendre du HTML non valide, utilisez un outil comme neko pour le nettoyer avant de le passer à la soucoupe volante.

1
Sam Barnum