[BlueLeaf1336]> PROGRAM>

DelphiでIEを操作する WebCapture

historyTOP

2006/12/15:作成
2006/12/16:ページ全体をひとつの画像にまとめるしくみ 追加

はじめにTOP

すんごく久しぶりに、購読している [CodeProject] Newsletter を読みました。すると、こんな記事が。

今、ネットにつながっていないので調べようがないのですが、Webページを画像にして保存するソフトが発売されていたようないないような。記事内容を読んでみるとまさにそれをやっているじゃないかと。

そういうわけで作ってみました。正確には、Delphiに翻訳してみました。

参考サイトTOP

最初の Code Project の記事を別にすると、参考にしたようなしてないような。

サンプルTOP

何はともあれ実際にどんな画像ができるのかが気になるところです。自分のサイトの中でおそらく一番縦長横長と思う、mdbの解析結果をhtmlファイルに出力するMDBer で出力した、 Accessのサンプルデータベース解析結果(250,227bytes) を画像にしてみました。

bmp 形式と jpg 形式で出力できるようにしているのですが、jpg は異常に画像が荒いので bmp で出力したところ、116,720,626 bytes つまり 111 MB の気軽にリンクできないサイズの画像ができてしまいました。

さすがにアップロードできないので、IrfanView を使って png に変換しました。それでも 1,488,259 bytes (1.41 MB) あるのですが、コレぐらいなら何とか。

ダウンロードほかTOP

作ったものの一切用途が見いだせなくて困っていますが、一時的な気の迷いが発生した方のために公開しておきます。

すでに明らかな問題点として

全ては「いつかのために」作ったもののため「技術的な確認で終了」というわけです。

WebCapture.zip(425,590Bytes) ソースコードと実行ファイルです。

今回はどちらかというとソースコードの方が役に立つように思います。ソフトできることよりも、IEを操作することを主体に考えているため、このページのタイトルもそのようにしています。

後で見たときの自分のために、IEを操作するときのキーワードをいくつかあげておきます。あ、ちなみに、TWebBrowser_V1 とかいうものを、フォーム上に配置したりせず、その時点で起動している IE とその表示物を対象にしています。

こんなところですかね。IE の(多分)全ての部品は、アクセスできる形で参照できるのでいろいろできそうです。少しだけ擬似コードを。

var
    i: Integer;
    LShell: ShellWindows;
    LInternetExplorer: InternetExplorer;
    LDocument: IHTMLDocument2;
    LDispBody: DispHTMLBody;
begin
    //  エクスプローラとインターネットエクスプローラにアクセスできる何か
    LShell := CoShellWindows.Create();
    //  順番に参照して行き
    for i := 0 to LShell.Count - 1 do
    begin
        //  取り出す
        LInternetExplorer := (LShell.Item(i) as InternetExplorer);

        if (LInternetExplorer <> nil) then
        begin
            //  アプリケーションのフルパスを求め
            LExePath := LInternetExplorer.FullName;
            //  インターネットエクスプローラなら
            if AnsiSameText('iexplore.exe', ExtractFileName(LExePath)) then
            begin
                //  Document取り出し
                LDocument := LInternetExplorer.Document as IHTMLDocument2;
                //  Body取り出してDispHTMLBodyにアレする
                LDispBody := LDocument.body as DispHTMLBody;
                //  後は、LDispBody に大量に用意されているプロパティにアクセス
                //  するなどしていろいろともてあそぶ
            end;
        end;
    end;

end;

ページ全体をひとつの画像にまとめるしくみ (2006/12/16)TOP

このプログラムのしくみですが、非常に原始的で、それゆえの弱点もあります。(あまりやりたくないですが)人力でひとつの画像にまとめるときのことを考えてもらえればまさにそれが答えです。つまり、画面には全体の一部しか映らないので、少しずつスクロールして全ての部分をカバーするように画像を準備し、ペイントやなにかに位置を調節しながら貼り付けてひとつの大きな画像にする、というものです。

出力は画像なので、プリントスクリーンと同じ原理でよいわけですが、「インターネットエクスプローラをスクロール」するために「IEを操作する」必要が出てくることになります。

このページでダウンロードできるソースコードは無駄に長いのですが、実際に意味のある「IEを操作している」箇所は、スクロールさせるところだけです。逆にいえばそれだけのために、IHTMLDocument2 やなんやを使わないといけないことに。

EOFTOP