多くのツールには、.MHTファイルをエクスポートする方法があります。その単一のファイルをファイルのコレクション、HTMLファイル、関連画像、CSSファイルに変換し、Webホストにアップロードしてすべてのブラウザーで使用できるようにする方法が必要です。これを行うためのツール、ライブラリ、アルゴリズムを知っている人はいますか?.
さて、あなたは.MHTファイルをIEで開き、Webページとして保存することができます。このページでこれをテストしましたが、IE(それはIE)、保存されてからChromeのように、正常に表示されたように見えます)で正常に開きました。
その方法がなければ、ファイル自体を見て、テキストブロックはそのままファイルに保存され、他のすべてのコンテンツはBase64に保存されます。コンテンツの各アイテムの前には、次のものが続きます。
[Boundary]
Content-Type: [Mime Type]
Content-Transfer-Encoding: [Encoding Type]
Content-Location: [Full path of content]
[MIMEタイプ]、[エンコードタイプ]、および[コンテンツの完全パス]は可変です。 [[Encoding Type]は、base64またはquoted-printable。 [Boundary]は.MHTファイルの最初に次のように定義されています:
From: <Saved by WebKit>
Subject: converter - How can you programmatically (or with a tool) convert .MHT mhtml files to regular HTML and CSS files? - Stack Overflow
Date: Fri, 9 May 2013 13:53:36 -0400
MIME-Version: 1.0
Content-Type: multipart/related;
type="text/html";
boundary="----=_NextPart_000_0C08_58653ABB.B67612B7"
それを使用して、必要に応じて独自のファイルパーサーを作成できます。
MHTファイルは基本的にMIMEです。したがって、Chilkat.Mimeまたは完全にフリーのSystem.Net.Mimeコンポーネントを使用して、その内部構造にアクセスすることが可能です。たとえば、MHTに画像が含まれている場合、出力HTMLでbase64文字列に置き換えることができます。
Imports HtmlAgilityPack
Imports Fizzler.Systems.HtmlAgilityPack
Imports Chilkat
Public Function ConvertMhtToHtml(ByVal mhtFile As String) As String
Dim chilkatWholeMime As New Chilkat.Mime
'Load mime'
chilkatWholeMime.LoadMimeFile(mhtFile)
'Get html string, which is 1-st part of mime'
Dim html As String = chilkatWholeMime.GetPart(0).GetBodyDecoded
'Create collection for storing url of images and theirs base64 representations'
Dim allImages As New Specialized.NameValueCollection
'Iterate through mime parts'
For i = 1 To chilkatWholeMime.NumParts - 1
Dim m As Chilkat.Mime = chilkatWholeMime.GetPart(i)
'See if it is image'
If m.IsImage AndAlso m.Encoding = "base64" Then
allImages.Add(m.GetHeaderField("Content-Location"), "data:" + m.ContentType + ";base64," + m.GetBodyEncoded)
End If : m.Dispose()
Next : chilkatWholeMime.Dispose()
'Now it is time to replace the source attribute of all images in HTML with dataURI'
Dim htmlDoc As New HtmlDocument : htmlDoc.LoadHtml(html) : Dim docNode As HtmlNode = htmlDoc.DocumentNode
For i = 0 To allImages.Count - 1
'Select all images, whose src attribute is equal to saved URL'
Dim keyURL As String = allImages.GetKey(i) 'Saved url from MHT'
Dim elementsWithPics() As HtmlNode = docNode.QuerySelectorAll("img[src='" + keyURL + "']").ToArray
Dim imgsrc As String = allImages.GetValues(i)(0) 'dataURI as base64 string'
For j = 0 To elementsWithPics.Length - 1
elementsWithPics(j).SetAttributeValue("src", imgsrc)
Next
'Select all elements, whose style attribute contains saved URL'
elementsWithPics = docNode.QuerySelectorAll("[style~='" + keyURL + "']").ToArray
For j = 0 To elementsWithPics.Length - 1
'Get and modify style'
Dim modStyle As String = Strings.Replace(elementsWithPics(j).GetAttributeValue("style", String.Empty), keyURL, imgsrc, 1, 1, 1)
elementsWithPics(j).SetAttributeValue("style", modStyle)
Next : Erase elementsWithPics
Next
'Get final html'
Dim tw As New StringWriter()
htmlDoc.Save(tw) : html = tw.ToString : tw.Close() : tw.Dispose()
Return html
End Function
@ XGundam05は正しいと思います。これを機能させるために私がやったことは次のとおりです。
Visual StudioでWindowsフォームプロジェクトから始めました。 WebBrowserをフォームに追加し、2つのボタンを追加しました。次に、このコード:
_ private void button1_Click(object sender, EventArgs e)
{
webBrowser1.ShowSaveAsDialog();
}
private void button2_Click(object sender, EventArgs e)
{
webBrowser1.Url = new Uri("localfile.mht");
}
_
このコードを取得してファイルのリストに追加し、各ファイルをforeach
で処理できるはずです。 webBrowser
にはShowSaveAsDialog()
というメソッドが含まれています。そして、これは.mhtまたは単にhtmlまたは完全なページとして保存することを可能にします。
編集:webBrowserのドキュメントを使用して、この時点で情報をこすることができます。ここで、MSのとおりにrichTextBoxとパブリック変数を追加します。 http://msdn.Microsoft.com/en-us/library/ms171713.aspx
_ public string Code
{
get
{
if (richTextBox1.Text != null)
{
return (richTextBox1.Text);
}
else
{
return ("");
}
}
set
{
richTextBox1.Text = value;
}
}
private void button2_Click(object sender, EventArgs e)
{
webBrowser1.Url = new Uri("localfile.mht");
HtmlElement elem;
if (webBrowser1.Document != null)
{
HtmlElementCollection elems = webBrowser1.Document.GetElementsByTagName("HTML");
if (elems.Count == 1)
{
elem = elems[0];
Code = elem.OuterHtml;
foreach (HtmlElement elem1 in elems)
{
//look for pictures to save
}
}
}
}
_
したがって、自動化IEは困難であり、エンドツーエンドで使用できませんでした。そのため、それを実行するある種のコードを構築するのがよいと思います。githubでこれを見つけましたpython良いかもしれないもの
https://github.com/Modified/MHTifierhttp://decodecode.net/elitist/2013/01/mhtifier/
時間があれば、PowerShellで同様のことを実行してみます。