|   | 
 
|  
 .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などで開いたときにページが崩れる場合がある。
 
| カテゴリ:クラス・ライブラリ 処理対象:COMコンポーネント
 | 
 
|  
 | 
 
generated by  
 | 
 
 
 | 
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間