【问题标题】:generate .mht file programmatically以编程方式生成 .mht 文件
【发布时间】:2015-02-26 02:44:45
【问题描述】:

有人知道如何在 C# 中以编程方式生成 .mht 文件吗? 嵌入图像?问题是我已经意识到 .mht 文件 能够在其中嵌入图像,而这种嵌入的图像 当您更改其位置时,它会随整个文件(mht)一起移动。和 此文件可以在不同的浏览器上查看,包括 IE 6。

有人告诉我尝试使用 Data Url Scheme 技术。但它无法工作,因为 其他浏览器不支持。例如 IE 6。

【问题讨论】:

  • 我去过那里 - 虽然它很可能这样做,甚至自己写 - 不要去那里。 MHT 是非常专有的,大多数现代浏览器都不支持。我会先研究替代方案
  • 我认为最简单的方法是使用 IE 将一些简单的网页保存为 .mht,然后看看它是如何做到的。
  • 我尝试在 IE 上导出 .mht 文件。它似乎实现了 Data Url Scheme 技术。例如,如果在导出的文件中找到以下代码(mht)
  • Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: oakdome.com/lab/wp-content/step-two-create-new-connection.gif R0lGODlhwgEuAfcAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwMDcwKbK8AIAAgABRwAAbQsrVQ0v bjsARTsAcCg3Tyc6bBBVDxFWOA1wDR1pKidTFTRaMCptDyx0MQVPTA5FdxhlSw9qbzNHVS9Ocyxz RydseVQABFkBZFNhH2BlaQcWigYWrg46kwc6qzg8lSo4tQAczgU20gg15Cc10QJFkhNMtABqngBu
  • @chosenOneThabs MHT 基于 RFC 2557 - 请参阅下面的答案...

标签: c# mhtml


【解决方案1】:

这是可能的,并且肯定已经由其他人完成 - 相关材料和库/源代码:

【讨论】:

  • 我试过上面的。似乎他们能够将 html 文件转换为 mht。如果从 Web 访问 html 文件,则此方法有效。但是,如果您从本地驱动器访问 html 文件,则转换将不起作用。上述来源使用了这种方法: CreateMHTMLBody(URL, CDO.CdoMHTMLFlags.cdoSuppressNone, "", "");
  • 我试图在 html 文件中嵌入图像的原因是因为我正在创建一个必须导出带有图像的报告的 Windows 窗体应用程序。有没有办法不使用商业库来完成?
  • @chosenOneThabs 不使用商业库的唯一方法是自己实现完整的格式(仅部分记录)。
  • 哦,我终于决定使用 Visual Studio 的 ReportViewer 控件,因为我意识到这个问题需要我一些时间来解决,而且我有一个截止日期。但是非常感谢,至少我了解了 MHT 文件的工作原理。
【解决方案2】:

在 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,它应该可以工作。只需传递文件路径而不是 URL
【解决方案3】:

MSDN has a great article(2011 年 6 月)关于如何使用 CDO 和 System.Net.Mail 创建 MHT 文件。完整包含 C# 源代码。我会在 VB.Net 或 Google Code 版本之上使用它。

【讨论】:

  • Notes: 使用 CDO 的主要缺点是: COM Interop!不起作用在 64 位系统中 (x64)
  • Notes: 此示例(MSDN 文章)不包含处理 css 背景图像和 iframe 的代码
【解决方案4】:

我会从RFC 2557 开始,以便我对我正在使用的内容有一些基本的了解。那就去找code/libraries处理吧。

据我所知,没有 BCL 类可以处理 MHTML。

【讨论】:

  • 我试过上面的。似乎他们能够将 html 文件转换为 mht。如果从 Web 访问 html 文件,则此方法有效。但是,如果您从本地驱动器访问 html 文件,则转换将不起作用。上述来源使用了这种方法: CreateMHTMLBody(URL, CDO.CdoMHTMLFlags.cdoSuppressNone, "", "");
  • 我试图在 html 文件中嵌入图像的原因是因为我正在创建一个必须导出带有图像的报告的 Windows 窗体应用程序。有没有办法不使用商业库来完成?
  • 将报告创建为模板。从 ie 导出。进行搜索/替换以获取报告内容。
  • 哦,我终于决定使用 Visual Studio 的 ReportViewer 控件,因为我意识到这个问题需要我一些时间来解决,而且我有一个截止日期。但是非常感谢,至少我了解了 MHT 文件的工作原理。
猜你喜欢
  • 2018-01-29
  • 2014-08-10
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 2022-12-13
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
相关资源
最近更新 更多