web-dev-qa-db-ja.com

JavaでWebページのスクリーンショットを撮ります

特定のWebページを読み取ってスクリーンショットを撮ることができる無料のツールはありますか?

25
mgamer

上記の2つの答えに基づいて作成するには:

JavaでHTMLをレンダリングしてから画像に保存する-いくつかのJavaベースのHTMLレンダリングが存在しますが、すべて異なる欠点があります。最も一般的なものは、 組み込み 。これは非常にシンプルで、かなり基本的なHTMLしかレンダリングできません。私が知っている最も興味深いのは The Flying Saucer Project です。これはかなり複雑なXHTMLをレンダリングできますが、 HTMLを使用する前に変換する必要があります( JTindy が役立つかもしれません)Swingコンポーネントを取得して画像を作成するのは非常に簡単です。 BufferedImage s graphics オブジェクトを作成してSwingコンポーネントに渡します Paint メソッド。次に、 ImageIO でスプラットします。
これの大きな利点は、レンダラーがヘッドレスになることです。欠点は、完全なレンダリングではなく、プラグインがないことです。

2番目のオプションでは、Webブラウザーを起動し、それがどこにあるかを調べてから、スクリーンショットを撮る必要があります。オプションで、Firefox/IE/Opera/etcのすべてのメニューを取り除いて、画像だけを残すこともできます。 Webブラウザーのサイズを取得する最も簡単なオプションは、フルスクリーンで起動することです。他のオプションは、JDICs browser コンポーネントのようなものを使用してJavaアプリケーションの一部として含めることです。これにより、HTMLの場所を指定できます。画面にレンダリングし、次に Robot を使用して、その領域のスクリーンショットを作成します。
これの大きな利点は、(特定のブラウザに対して)完全なレンダリングを提供することです。 2つの欠点は、ネイティブコードが必要になる(または少なくともネイティブコンポーネントを使用する)ことと、ヘッドレスにならないことです¹。

1)仮想フレームバッファーを使用できます。しかし、それはJavaの外側です。

16

VirtualFramebufferとFirefox Binaryを使用したSelenium Webdriverで最高の結果が得られました。これは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();
    }
}
20
Janning

それはJavaではありませんが、ここに来て、私が最終的に使用したものなので、言及する価値があると思います。 PhantomJs を使用すると、ヘッドレスバージョンのWebkitを実行し、スクリーンキャプチャのリクエストを処理してローカルに保存できる組み込みのマングースWebサーバーを通じて機能にアクセスできます。 Java=を使用してリクエストを行うことができます。レスポンスにはサーバー上の画像へのURLを含めることができるため、それを取得することもできます-

6
chrismarx

selenium-rcを使用

2
flybywire

Awt.RobotでcreateScreenCaptureメソッドを使用できます。このメソッドでは、画面のどの部分をキャプチャするかを指定できます。したがって、キャプチャしたいWebページを含むウィンドウの座標を決定する必要があります。

2
JZeeb

純粋なJavaでHTMLをレンダリングするには、フライングソーサーをご覧ください。

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

XML/XHTML/CSS 2.1をレンダリングします

有効なXMLまたはXHTMLでのみ機能するので、無効なHTMLをレンダリングする必要がある場合は、nekoなどのツールを使用して、空飛ぶ円盤に渡す前にクリーンアップしてください。

1
Sam Barnum