.NET TIPS

WebページをMHT形式(.mhtファイル)で保存するには?[C#、VB]

デジタルアドバンテージ 遠藤 孝信
2007/12/27

 Internet Explorer(以下、IE)では、現在開いているWebページを単一のMHT形式のファイル(.mhtファイル)として保存できる*1。通常、WebページはHTMLファイルやJPEGファイル、CSSファイルなどの複数のファイルから構成されるが、MHT形式ではそれらを丸ごと1つのファイルにまとめてしまうことができるため、Webページを保存しておきたい場合などには便利な機能である。

*1 WebページをMHT形式で保存するには、メニューの[ファイル]−[名前を付けて保存]により[Webページの保存]ダイアログを開き、[ファイルの種類]で「Webアーカイブ、単一のファイル(*.mht)」を選択して保存する。


[Webページの保存]ダイアログ
IEのメニューの[ファイル]−[名前を付けて保存]により開く。

 本稿では、C#やVBからWebページをMHT形式で保存する方法について解説する。

必要となる2つのCOMコンポーネント

 本稿では次の2つのCOMコンポーネントを利用してWebページの保存を行う方法について説明する。

  • Microsoft CDO for Windows 2000 Library(以下、CDO)
  • Microsoft ActiveX Data Objects 2.8 Library(以下、ADO)

 前者のCDO(Collaboration Data Objects)はメッセージング処理(メールなどのメッセージの送受信)を行うためのCOMコンポーネントであり、後者のADOはデータベースにアクセスするためのCOMコンポーネントである*2

*2 CDOはWindowsに標準で搭載されている。また、ADOはMDAC(Microsoft Data Access Components)に含まれている(MDACは.NET Frameworkのインストールに必要)。

 Visual StudioでこれらのCOMコンポーネントを使用するには、プロジェクトの参照設定で「参照の追加」を行う。


プロジェクトの参照設定を行うための[参照の追加]ダイアログ
ソリューション・エクスプローラ内のプロジェクト名を右クリックし、メニューより[参照の追加]を実行して開く。[COM]タブからADOとCDOを選択して[OK]ボタンをクリックする。

 この参照設定により、COMコンポーネントを利用するためのクラスやインターフェイスを含んだ「Interop.ADODB.dll」および「Interop.CDO.dll」という2つのアセンブリが自動生成される。

 コマンドラインでこれらのアセンブリを作成するには、次のようにしてTlbImpコマンドを実行すればよい。

TlbImp C:\WINDOWS\system32\cdosys.dll
TlbImp "C:\Program Files\Common Files\System\ado\msado15.dll"
TlbImpコマンドを利用したアセンブリの作成
これらのコマンドを実行すると「ADODB.dll」および「CDO.dll」が作成される。

WebページをMHT形式で保存

 COMコンポーネントについての詳しい説明はここでは割愛するが、WebページをMHT形式で保存するだけなら以下のような手順で比較的簡単に行える。

 まず、CDOのMessageClassクラスをインスタンス化し、そのCreateMHTMLBodyメソッドを呼び出してWebページを取得する。そして、そのデータへのストリーム(ADODBのStreamオブジェクト)をGetStreamメソッドで取り出し、SaveToFileメソッドでファイルに保存するだけだ。

 以下に、Insider.NETのトップページを「fdotnet.mht」というファイルに保存するサンプル・プログラムを示す。

// createmht.cs

class MHT {

  static bool CreateMHT(string url, string file) {

    CDO.MessageClass msg = new CDO.MessageClass();

    try {
      // CDO.CdoMHTMLFlags.cdoSuppressNoneは
      // ページ内で参照しているすべてのリソースをダウンロード
      msg.CreateMHTMLBody(
            url, // 保存するページのURL
            CDO.CdoMHTMLFlags.cdoSuppressNone,
            "",  // 認証が必要な場合のユーザー名
            ""); // およびパスワード
    } catch {
      System.Console.WriteLine("ページ取得失敗");
      return false;
    }
    ADODB.Stream st = msg.GetStream();
    st.SaveToFile(
          file, // 保存先のファイルのパス名
          ADODB.SaveOptionsEnum.adSaveCreateOverWrite);
    st.Close();
    return true;
  }

  public static void Main() {
    CreateMHT(
        "http://www.atmarkit.co.jp/fdotnet/",
        "fdotnet.mht");
  }
}

// コンパイル方法:csc /r:ADODB.dll /r:CDO.dll createmht.cs
WebページをMHT形式で保存するC#のサンプル・プログラム(createmht.cs)

' createmht.vb

Class MHT

  Shared Function CreateMHT(ByVal url As String, ByVal file As String) As Boolean

    Dim msg As New CDO.MessageClass()

    Try
      ' CDO.CdoMHTMLFlags.cdoSuppressNoneは
      ' ページ内で参照しているすべてのリソースをダウンロード
      msg.CreateMHTMLBody( _
        url, _
        CDO.CdoMHTMLFlags.cdoSuppressNone, _
        "", _
        "")
    Catch
      System.Console.WriteLine("ページ取得失敗")
      Return False
    End Try

    Dim st As ADODB.Stream = msg.GetStream()
    st.SaveToFile( _
      file, _
      ADODB.SaveOptionsEnum.adSaveCreateOverWrite)
    st.Close()
    Return True
  End Function

  Shared Sub Main()
    CreateMHT( _
      "http://www.atmarkit.co.jp/fdotnet/", _
      "fdotnet.mht")
  End Sub

End Class

' コンパイル方法:vbc /r:adodb.dll /r:cdo.dll createmht.vb
WebページをMHT形式で保存するVBのサンプル・プログラム(createmht.vb)

 ただし、CreateMHTMLBodyメソッドは再帰的な外部ファイルの読み込みをサポートしていないようである。このため、例えばHTMLファイルが参照している別ファイルのスタイルシートAが、さらに別のスタイルシートBをインポートしているような場合、作成されたMHTファイルにはスタイルシートBが含まれず、MHTファイルをIEなどで開いたときにページが崩れる場合がある。End of Article

カテゴリ:クラス・ライブラリ 処理対象:COMコンポーネント

この記事と関連性の高い別の.NET TIPS
[ASP.NET]ページから生成されたソース・コードを見るには?
[ASP.NET]ブラウザからファイルをアップロードできるようにするには?
WebClientクラスでWebページを取得するには?
サーバにより指定されたファイル名でファイルをダウンロードして保存するには?
アプリケーション設定を活用するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間