是否有免费工具可以读取给定网页并对其进行截图?
6 回答
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();
}
}
以上述两个答案为基础:
在 Java 中渲染 HTML 然后保存到图像 - 存在一些基于 Java 的 HTML 渲染,都有不同的缺点。最常见的是内置的。这很简单,只能呈现相当基本的 HTML。我所知道的最有趣的是飞碟计划。这可以呈现相当复杂的 XHTML,但您必须先转换 HTML,然后才能使用它(JTindy可能会在这里提供帮助)。获取 Swing 组件并创建图像非常简单,您只需传递一个BufferedImage
s图形对象并将其传递给 Swing 组件的绘制方法。然后用ImageIO把它吐出来。
这样做的一大优势是渲染器将是无头的。缺点是它不会是一个完美的渲染,它会缺少任何插件。
第二个选项要求您启动网络浏览器,确定它的位置,然后截屏。或者,您可能还希望删除所有 Firefox/IE/Opera/etc 菜单,只留下图像。要获得网络浏览器的尺寸,最简单的选择是全屏启动它。另一种选择是使用 JDIC浏览器组件之类的东西将其作为 Java 应用程序的一部分。然后它将能够指定 HTML 在屏幕上呈现的位置,然后只需使用Robot创建该区域的屏幕截图。
这样做的最大优点是它将提供完美的渲染(对于给定的浏览器)。两个缺点是它需要本机代码(或至少使用本机组件)并且它不能是无头的¹。
1)您可以使用虚拟帧缓冲区。但那是在 Java 之外。
它不是Java,但是来这里之后,它是我最终使用的,所以我认为值得一提。使用PhantomJs,您可以运行无头版本的 webkit,然后通过内置的 mongoose 网络服务器访问该功能,该服务器可以处理截屏请求,并将它们存储在本地。您可以使用 Java 发出请求,并且响应可以包含服务器上图像的 url,因此您也可以获取它-
使用硒-rc
您可以使用 awt.Robot 中的 createScreenCapture 方法。此方法允许您指定要捕获屏幕的哪个部分。因此,您仍然需要确定包含您要捕获的网页的窗口的坐标。
要在纯 Java 中呈现 HTML,您可以查看 Flying Saucer。
http://code.google.com/p/flying-saucer//
它呈现 XML/XHTML/CSS 2.1
我相信它只适用于有效的 XML 或 XHTML,所以如果您需要渲染无效的 HTML,请使用像 neko 这样的工具来清理它,然后再将其传递给飞碟。