2009-10-01 6 views
23

Y at-il un outil gratuit qui peut lire la page Web donnée et en faire une capture d'écran?Prendre une capture d'écran d'une page Web en Java

+0

Allez-vous tirer un navigateur, ouvrir la page à l'intérieur, puis capturer le site Web ou voulez-vous le site Web rendu par le code de Java et qu'écrit dans l'image? – quosoo

Répondre

12

Pour construire sur deux des réponses ci-dessus:

Rendu le code HTML en Java puis en enregistrant une image - Quelques Java HTML basé rend existent, tous avec des ensembles d'inconvénients différents. Le plus commun est celui built in. C'est assez simple et ne peut rendre que du HTML assez basique. Le plus intrestant que je connaisse est The Flying Saucer Project. Cela peut rendre le XHTML assez complexe mais vous devrez convertir le HTML avant de pouvoir l'utiliser (JTindy peut être en mesure de vous aider ici). Prendre un composant Swing et créer une image est assez simple, il suffit de passer un objet BufferedImage s graphics et de le passer à la méthode des composants Swing paint. Ensuite, éclatez cela avec ImageIO.
Un grand avantage à ceci 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 n'y aurait aucun plugin.

La deuxième option nécessite de démarrer un navigateur Web, de déterminer son emplacement et de réaliser une capture d'écran. En option, vous pouvez également supprimer tous les menus Firefox/IE/Opera/etc en vous laissant avec juste l'image. Pour obtenir les dimensions du navigateur Web, l'option la plus simple serait de le lancer en plein écran. L'autre option serait d'utiliser quelque chose comme le composant JDICs browser pour l'inclure dans l'application Java. Il serait alors en mesure de spécifier où le HTML est rendu à l'écran, puis il suffit d'utiliser 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 faudrait du code natif (ou au moins en utilisant un composant natif) et il ne pourrait pas être sans tête¹.

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

+1

Il y a un navigateur dans Eclipse. En avez-vous l'expérience? –

+0

A part en tant qu'utilisateur, je n'ai pas (les API SWT me font peur). Mais un bon point, c'est probablement mieux que le défaut construit en un seul et meilleur support HTML que Flying Saucer. –

+0

JTidy n'a reçu que récemment des contributions récentes. Vous pouvez également essayer HtmlUnit (.sourceforge.net). +1 pour la référence du navigateur JDIC, ​​c'est un projet très ambitieux et nécessite plus de support. –

2

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 devez toujours déterminer les coordonnées de la fenêtre contenant la page Web que vous souhaitez capturer.

1

Pour rendre le HTML en Java pur, vous pourriez jeter un coup d'oeil à la soucoupe volante.

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

Il rend XML/XHTML/CSS 2.1

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

18

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

d'abord installer Firefox et framebuffer virtuel:

aptitude install xvfb firefox 

Compilez et exécutez cette classe, /tmp/screenshot.png ouverte aprè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

Je peux confirmer que cela fonctionne très bien (mac OS) –

+0

yeap, mais utilisez/usr/X11/bin/xvfb – z0mb1ek

+0

@janning Est-il possible d'obtenir l'URL de la fenêtre courante sélectionnée en utilisant java ... bcoz ma page Web a des onglets multiples et chacun temps je clique sur chacun des onglets correspondant url devrait être passé comme champ URL – chopss

6

Ce n'est pas Java , mais après être venu ici, c'est ce que j'ai fini par utiliser, donc je pense que ça vaut la peine 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 mongoose intégré, qui peut gérer les demandes de captures 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, de sorte que vous pouvez saisir cela aussi -

Questions connexes