|
.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 記事ランキング
本日
月間