153 votes

Faire une capture d'écran d'une page web avec JavaScript ?

Est-il possible de faire une capture d'écran d'une page Web avec JavaScript et de la renvoyer au serveur ?

Je ne suis pas tellement préoccupé par les questions de sécurité du navigateur, etc. que la mise en œuvre serait pour HTA . Mais est-ce possible ?

0 votes

Pouvez-vous préciser pourquoi vous voulez faire cela ? Il existe peut-être d'autres solutions que les captures d'écran.

0 votes

J'envisage de demander à l'utilisateur de concevoir grossièrement ce qu'il veut, un peu comme un croquis et un peu comme un glisser-déposer d'objets. Je veux ensuite que ce "design" soit utilisé comme une partie des instructions dans un processus de production. Il s'agit bien d'une étape impliquant l'utilisateur, rien de clandestin ici :)

0 votes

144voto

JAAulde Points 10235

Google fait cela dans Google+ et un développeur talentueux a fait de l'ingénierie inverse et a produit http://html2canvas.hertzen.com/ . Pour travailler dans IE, vous aurez besoin d'une bibliothèque de support de canevas telle que http://excanvas.sourceforge.net/

2 votes

Merci, les liens dans votre post expliquent tout bien.

2 votes

Si vous ne voulez pas faire ça pour vous, Usersnap pourrait valoir le coup d'essayer. Il s'agit d'une solution rapide pour obtenir des captures d'écran précises de vos visiteurs sans installer de plugin (et sans Java, ActiveX ou Flash).

44voto

Joel Anair Points 8561

Je l'ai fait pour un HTA en utilisant un contrôle ActiveX. Il a été assez facile de construire le contrôle en VB6 pour faire la capture d'écran. J'ai dû utiliser l'appel API keybd_event parce que SendKeys ne peut pas faire PrintScreen. Voici le code pour cela :

Declare Sub keybd_event Lib "user32" _
(ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Public Const CaptWindow = 2

Public Sub ScreenGrab()
   keybd_event &H12, 0, 0, 0
   keybd_event &H2C, CaptWindow, 0, 0
   keybd_event &H2C, CaptWindow, &H2, 0
   keybd_event &H12, 0, &H2, 0
End Sub

Cela ne vous permet que de placer la fenêtre dans le presse-papiers.

Une autre option, si la fenêtre dont vous voulez faire une capture d'écran est une HTA, serait d'utiliser simplement un XMLHTTPRequest pour envoyer les nœuds DOM au serveur, puis de créer les captures d'écran côté serveur.

0 votes

Je suis d'accord avec Allen, c'est une façon ingénieuse de potentiellement faire une capture d'écran d'une page !

0 votes

Qu'est-ce qu'un "HTA" s'il vous plaît ?

2 votes

@PeteAlvin une HTA est une application Hypertext, qui était un moyen d'exécuter des applications JS privilégiées dans Internet Explorer. Pas très pertinent aujourd'hui.

15voto

Une autre solution possible que j'ai découverte est http://www.phantomjs.org/ qui permet de faire très facilement des captures d'écran de pages et bien d'autres choses encore. Bien que mes exigences initiales pour cette question ne soient plus valables (un autre travail), je vais probablement intégrer PhantomJS dans de futurs projets.

0 votes

Savez-vous si phantomjs peut générer une image d'un élément sur une page (pas la page entière) ?

0 votes

Si, vous le pouvez. Soit vous utilisez cet extrait avec PhantomJS ou utiliser CasperJS .

13voto

RobertPitt Points 28140

Pounder's si c'est possible de le faire en plaçant tous les éléments du corps dans une toile puis en utilisant canvas2image ?

http://www.nihilogic.dk/labs/canvas2image/

0 votes

Je me demande si SVG pourrait aider, je vais devoir regarder les sources de Google.

1 votes

Vous pouvez utiliser le code html2canvas de Niklas pour rendre le html dans le canvas, puis l'utiliser pour enregistrer une image.

10voto

RobertPitt Points 28140

Une façon possible de le faire, si vous êtes sous Windows et que .NET est installé, vous pouvez le faire :

public Bitmap GenerateScreenshot(string url)
{
    // This method gets a screenshot of the webpage
    // rendered at its full size (height and width)
    return GenerateScreenshot(url, -1, -1);
}

public Bitmap GenerateScreenshot(string url, int width, int height)
{
    // Load the webpage into a WebBrowser control
    WebBrowser wb = new WebBrowser();
    wb.ScrollBarsEnabled = false;
    wb.ScriptErrorsSuppressed = true;
    wb.Navigate(url);
    while (wb.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); }

    // Set the size of the WebBrowser control
    wb.Width = width;
    wb.Height = height;

    if (width == -1)
    {
        // Take Screenshot of the web pages full width
        wb.Width = wb.Document.Body.ScrollRectangle.Width;
    }

    if (height == -1)
    {
        // Take Screenshot of the web pages full height
        wb.Height = wb.Document.Body.ScrollRectangle.Height;
    }

    // Get a Bitmap representation of the webpage as it's rendered in the WebBrowser control
    Bitmap bitmap = new Bitmap(wb.Width, wb.Height);
    wb.DrawToBitmap(bitmap, new Rectangle(0, 0, wb.Width, wb.Height));
    wb.Dispose();

    return bitmap;
}

Et ensuite, via PHP, vous pouvez le faire :

exec("CreateScreenShot.exe -url http://.... -save C:/shots domain_page.png");

Vous avez alors la capture d'écran du côté serveur.

1 votes

Bien qu'elle n'ait pas grand-chose à voir avec les questions posées, cette suggestion est géniale ! Merci !

0 votes

Pourquoi ne charge-t-il pas certains styles que je vois déjà chargés dans IE9 ? !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X