特定のWebページを読み取ってスクリーンショットを撮ることができる無料のツールはありますか?
6 に答える
VirtualFramebufferとFirefoxBinaryを使用したSeleniumWebdriverで最良の結果が得られました。これはubuntuでテストされています。xvfbとfirefoxをインストールする必要があります
最初にFirefoxと仮想フレームバッファをインストールします。
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();
}
}
上記の2つの答えに基づいて構築するには:
JavaでHTMLをレンダリングしてから画像に保存する-JavaベースのHTMLレンダリングがいくつか存在しますが、すべて異なる欠点があります。最も一般的なのは、組み込みのものです。これは非常に単純で、かなり基本的なHTMLしかレンダリングできません。私が知っている中で最も興味深いのは、フライングソーサープロジェクトです。これにより、かなり複雑なXHTMLがレンダリングされる可能性がありますが、使用する前にHTMLを変換する必要があります(JTindyがここで役立つ場合があります)。Swingコンポーネントを取得して画像を作成するのは非常に簡単です。グラフィックスBufferedImage
オブジェクトを渡して、それをSwingコンポーネントのpaintメソッドに渡すだけです。次に、 ImageIOでそれをスプラットします。
これの大きな利点は、レンダラーがヘッドレスになることです。欠点は、完全なレンダリングではなく、プラグインがないことです。
2番目のオプションでは、Webブラウザーを起動し、それがどこにあるかを調べてから、スクリーンショットを撮る必要があります。オプションで、Firefox / IE / Opera / etcのすべてのメニューを削除して、画像だけを残すこともできます。Webブラウザーのサイズを取得するには、フルスクリーンで起動するのが最も簡単なオプションです。もう1つのオプションは、JDICブラウザコンポーネントのようなものを使用して、Javaアプリケーションの一部として含めることです。次に、HTMLが画面上のどこにレンダリングされているかを指定し、Robotを使用してその領域のスクリーンショットを作成することができます。
これの大きな利点は、(特定のブラウザに対して)完璧なレンダリングが得られることです。2つの欠点は、ネイティブコードが必要になること(または少なくともネイティブコンポーネントを使用すること)と、ヘッドレスではないことです¹。
1)仮想フレームバッファを使用できます。しかし、それはJavaの外です。
Javaではありませんが、ここに来てから使ってみたので、言及する価値があると思います。PhantomJを使用すると、ヘッドレスバージョンのWebkitを実行し、組み込みのマングースWebサーバーを介して機能にアクセスできます。このWebサーバーは、スクリーンキャプチャの要求を処理し、ローカルに保存できます。Javaを使用してリクエストを行うことができ、レスポンスにはサーバー上の画像へのURLを含めることができるため、それも取得できます-
selenium-rcを使用する
awt.RobotでcreateScreenCaptureメソッドを使用できます。この方法では、画面のどの部分をキャプチャするかを指定できます。したがって、キャプチャするWebページを含むウィンドウの座標を決定する必要があります。
HTMLを純粋なJavaでレンダリングするには、FlyingSaucerを参照してください。
http://code.google.com/p/flying-saucer//
XML / XHTML /CSS2.1をレンダリングします
有効なXMLまたはXHTMLでのみ機能すると思います。したがって、無効なHTMLをレンダリングする必要がある場合は、ネコなどのツールを使用してクリーンアップしてから、フライングソーサーに渡します。