以编程方式生成 .mht 文件

12

有没有人知道如何在C#中以编程方式生成包含嵌入式图片的.mht文件?问题是我发现.mht文件可以将图片嵌入其中,而且这些嵌入的图片会随着整个文件(mht)一起移动,无论更改其位置。此外,不同的浏览器,包括IE 6,都可以查看此文件。

我被告知尝试使用数据URL方案技术。但它无法工作,因为其他浏览器(例如IE 6)不支持它。


1
我认为最简单的方法是使用IE将几个简单的网页保存为.mht文件,然后查看它是如何实现的。 - L.B
1
我尝试在IE上导出.mht文件。它似乎使用了Data Url Scheme技术。例如,我在导出的文件(mht)中找到了以下代码。 - chosenOne Thabs
1
内容类型:image/gif 内容传输编码:base64 内容位置:http://www.oakdome.com/lab/wp-content/step-two-create-new-connection.gifR0lGODlhwgEuAfcAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwMDcwKbK8AIAAgABRwAAbQsrVQ0v bjsARTsAcCg3Tyc6bBBVDxFWOA1wDR1pKidTFTRaMCptDyx0MQVPTA5FdxhlSw9qbzNHVS9Ocyxz RydseVQABFkBZFNhH2BlaQcWigYWrg46kwc6qzg8lSo4tQAczgU20gg15Cc10QJFkhNMtABqngBu - chosenOne Thabs
1
@chosenOneThabs MHT基于RFC 2557 - 请参见下面的答案... - Yahia
我尝试在HTML文件中嵌入图像的原因是因为我正在创建一个Windows窗体应用程序,需要导出带有图像的报告。是否有一种方法可以在不使用商业库的情况下完成? - chosenOne Thabs
显示剩余2条评论
4个回答

9

我尝试了上述方法。看起来它们能够将HTML文件转换为MHT文件。如果从Web访问HTML文件,则此方法有效。但是,如果您从本地驱动器访问HTML文件,则转换将无法正常工作。上述来源使用了以下方法: CreateMHTMLBody(URL, CDO.CdoMHTMLFlags.cdoSuppressNone, "", ""); - chosenOne Thabs
我尝试在HTML文件中嵌入图像的原因是因为我正在创建一个Windows窗体应用程序,需要导出带有图像的报告。是否有一种方法可以在不使用商业库的情况下完成? - chosenOne Thabs
@chosenOneThabs 如果不使用商业库,唯一的方法就是自己实现完整格式(只有部分文档记录)。 - Yahia
哦,我最终决定利用Visual Studio的ReportViewer控件,因为我意识到这个问题需要花费我一些时间来解决,而且我有一个截止日期。但是非常感谢你,至少我学到了MHT文件的工作原理。 - chosenOne Thabs

8
在Windows环境下,您可以直接通过 CDO.Message COM组件来实现这一点,该组件公开了 IMessage interface。我不知道如何在C#中导入COM对象的详细信息,因此我将为您提供一个类似于C语法的快速示例:
IMsgObj = CreateObject("CDO.Message")   // create the object
IMsgObj.CreateMHTMLBody("http://www.example.com/") // convert the URL to MHTML
IMsgObj.GetStream().SaveToFile("output.mht")  // save it to a file

CDO.Message组件的CLSID是{CD000001-8B95-11D1-82DB-00C04FB1625D}。
请注意,该组件旨在生成电子邮件消息(.eml文件扩展名而不是.mht),这意味着JavaScript文件不包括在内。否则它们大致相等。

本地驱动器的HTML文件是否有效? - Kiquenet
@Kiquenet,它应该可以工作。只需传递文件路径而不是URL即可。 - GetFree

3

MSDN网站(2011年6月)有一篇关于使用CDO和System.Net.Mail创建MHT文件的优秀文章。其中包含完整的C#源代码。我建议使用这个教程而不是VB.Net或Google Code版本。


1
注意:使用 CDO 的主要缺点是: _COM Interop!_和 无法在 64 位系统 (x64) 上运行。 - Kiquenet
注意:此示例(MSDN文章)不包括处理CSS背景图像和iframe的代码。 - Kiquenet

1
我会从RFC 2557开始,以便对我正在处理的内容有一些基本的了解。然后去寻找代码/库来处理它。
据我所知,没有BCL类来处理MHTML。

我尝试了上述内容。看起来它们能够将html文件转换为mht。如果从web访问html文件,则可以使用此方法。但是,如果您从本地驱动器访问html文件,则转换无法正常工作。上述来源使用了以下方法: CreateMHTMLBody(URL,CDO.CdoMHTMLFlags.cdoSuppressNone,"",""); - chosenOne Thabs
我尝试将图像嵌入到HTML文件中的原因是,我正在创建一个Windows表单应用程序,需要导出带有图片的报告。是否有一种方法可以在不使用商业库的情况下完成? - chosenOne Thabs
将报告创建为模板。从ie导出。进行搜索/替换以获取报告内容。 - Sam Axe
哦,我最终决定利用Visual Studio的ReportViewer控件,因为我意识到这个问题将花费我很多时间去解决,而我又有一个截止日期。非常感谢你,至少我学到了MHT文件是如何工作的。 - chosenOne Thabs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接