Подтвердить что ты не робот

Сделайте снимок экрана веб-страницы в Java

Есть ли бесплатный инструмент, который может читать данную веб-страницу и делать снимок экрана?

4b9b3361

Ответ 1

Чтобы опираться на два из приведенных выше ответов:

Рендеринг HTML в Java, а затем сохранение на изображение. Существует несколько HTML-рендерингов на основе Java, все с разными наборами недостатков. Наиболее распространенным является встроенный. Это довольно просто и может отображать только простой базовый HTML. Самое интересное, о котором я знаю, это Проект Flying Saucer. Это может сделать довольно сложный XHTML, но вам придется преобразовать HTML, прежде чем вы сможете его использовать (JTindy может помочь здесь). Взятие компонента Swing и создание изображения довольно просто, вы просто передаете BufferedImage graphics и передать его компонентам Swing paint. Затем проложите это с помощью ImageIO.
Большим преимуществом этого было бы то, что рендеринг будет безголовым. Недостатком является то, что он не был бы идеальным рендерингом, и у него не было бы никаких плагинов.

Второй вариант требует, чтобы вы запустили веб-браузер, выяснили, где он находится, и затем сделайте снимок экрана. При желании вы также можете удалить все меню Firefox/IE/Opera/etc, оставив вас только с изображением. Чтобы получить размеры веб-браузера, самым простым вариантом было бы запустить его в полноэкранном режиме. Другой вариант - использовать что-то вроде JDICs browser, чтобы включить его как часть приложения Java. Затем он сможет указать, где HTML отображается на экране, а затем просто используйте Robot, чтобы создать снимок экрана этой области.
Большим преимуществом этого является то, что он даст идеальный рендеринг (для данного браузера). Два недостатка в том, что для этого потребуется собственный код (или, по крайней мере, с использованием нативного компонента), и он не может быть безголовым¹.

1) Вы можете использовать буфер виртуального фрейма. Но это за пределами Java.

Ответ 2

У меня были лучшие результаты с Selenium Webdriver, используя VirtualFramebuffer и Firefox Binary. Это проверено под ubuntu. Вам нужно установить xvfb и firefox

Сначала установите firefox и virtual framebuffer:

aptitude install xvfb firefox

Скомпилируйте и запустите этот класс, затем откройте файл /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();
    }
}

Ответ 3

Это не Ява, но, придя сюда, это то, что я использовал, поэтому я думаю, что стоит упомянуть. С помощью PhantomJs вы можете запустить безглавую версию webkit, а затем получить доступ к функциям через встроенный веб-сервер mongoose, который может обрабатывать запросы на screencaptures, и хранить их локально. Вы можете использовать Java для запроса, и ответ может иметь URL-адрес изображения на сервере, так что вы тоже можете его захватить -

Ответ 4

использовать selenium-rc

Ответ 5

Вы можете использовать метод createScreenCapture в awt.Robot. Этот метод позволяет вам указать, какую часть экрана нужно захватить. Таким образом, вам все равно нужно будет определить координаты окна, которое содержит веб-страницу, которую вы хотите захватить.

Ответ 6

Чтобы отобразить HTML в чистой java, вы можете взглянуть на Flying Saucer.

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

Он отображает XML/XHTML/CSS 2.1

Я считаю, что он работает только с допустимым XML или XHTML, поэтому, если вам нужно отобразить недействительный HTML, используйте инструмент, например neko, чтобы его очистить, прежде чем передавать его в летающую тарелку.