Есть ли бесплатный инструмент, который может читать данную веб-страницу и делать снимок экрана?
Сделайте снимок экрана веб-страницы в Java
Ответ 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, чтобы его очистить, прежде чем передавать его в летающую тарелку.