如何将offcie文档(.doc、.xls、.ppt)转换成mht文档(原理篇)

来源:互联网 发布:资格证书制作软件 编辑:程序博客网 时间:2024/05/22 13:26

      如何将上传的office文档转换成MHTML文档使之能在IE中浏览。我曾经上网查了一下,期望能找到这方面的例子,不过可惜的是这方面的资料太少了。不过,经过研究还是成功的实现了。
      要实现office文档转换成MHTML文档,首先会将office文档转换成HTML格式的文档,然后将HTML文档转换成MHTML文档。要将office文档转成HTML需要使用Microsoft.HtmlTrans.Interface的程序集。这个程序集是需要安装“HTML 转换服务器”。HTML 转换服务器是 Windows SharePoint Services 服务器场的可选组件。你可以在微软网站上找到该服务器的安装文件,或单击这里下载。按照下面的步骤安装:

1. 解压缩下载的文件,里面有文件:
eng11probypass.mst
htmltrbackend.msi
HTML Viewer WhitePaper文档
2. 如果已经安装了office,请先卸载,然后安装支持HTML Viewer Services的Office:
在Office安装路径下,找到Setup文件所在路径;
将eng11probypass.mst文件拷贝到该路径下;
在命令提示符下输入:Setup transforms= eng11probypass.mst来安装支持HTML Viewer的Office;
3. 安装HTML Viewer Server:运行htmltrbackend.msi;

安装好以后,找到Microsoft.HtmlTrans.Interface.dll文件并把它copy到项目文件夹中。在项目中引用该文件。由于将用到命名空间Microsoft.HtmlTrans中的htmlTrLoadBalancer和htmlTrLauncher两个Romoting对象将office文档转换为HTML文件。不过需要注意:

  • Document types not supported are:
    • Master documents in Word (see Word Help for an explanation of Master document)
    • Password protected documents, workbooks, and presentations (encrypted)
    • Word documents that use framesets
    • Files that contain Excel 4.0 macros
    • WordPerfect files
  • For files with embedded objects, VBA, scripts, etc, the following rules apply:
    • VBA is ignored and not executed; However, the VBA project (source code, dialog definitions, etc) is retained
    • Embedded and linked objects are converted to graphic images and displayed in the approximate location where they were in the source file
    • Linked or embedded objects with password protection are not converted

      在实现中另外一个难点就是如何将HTML转换成MHTML。MHTML是 MIME Encapsulation of Aggregate HTML的缩写,它是一种网络编码格式,是用来定义在电子邮件正文中如何传送html内容的MIME标准。通俗点说,就是一个HTML文件和包括其中的.css文件、.js文件、图片等等一切的资源文件都整合在一个MHTL文件中。以下是一个典型的MHTML文件(;后为解释部分):

Mime-Version: 1.0
; Content-Location为主文件地址,可以随意设定
Content-Location: http://www.ietf.cnri.reston.va.us/
; Content-Type为MTHML文件的类型,这里表示MHTML文件中包含多种文件类型
;boundary定义文件之间的分隔符,可随意定义
;type为主文件格式
Content-Type: multipart/related; boundary="boundary-example";type="text/html"

;在前面加”--”字符表示一个文件开始
--boundary-example
;以下是文件头
; text/html 表示该文件的文件类型;charset表示使用的字符集
Content-Type: text/html; charset="ISO-8859-1"
; Content-Transfer-Encoding:表示的是该文件的编码类型;
;一般有两种:一种是文本类型的一般使用”QUOTED-PRINTABLE”;
;另一种是二进制文件一般使用”BASE64”
Content-Transfer-Encoding: QUOTED-PRINTABLE

;以下是正文
... text of the HTML document, which might contain URIs
referencing resources in other body parts, for example through
statements such as:

<IMG SRC="images/ietflogo1.gif" ALT="IETF logo1">
<IMG SRC="images/ietflogo2.gif" ALT="IETF logo2">
<IMG SRC="images/ietflogo3.gif" ALT="IETF logo3">

Example of a copyright sign encoded with Quoted-Printable: =A9
Example of a copyright sign mapped onto HTML markup: &#168;

--boundary-example
; Content-Location:该文件的地址,可以是绝对地址或相对主文件的相对地址
;这里是绝对地址
Content-Location:http://www.ietf.cnri.reston.va.us/images/ietflogo1.gif
Content-Type: IMAGE/GIF
;二进制文件,使用BASE64编码
Content-Transfer-Encoding: BASE64

R0lGODlhGAGgAPEAAP/////ZRaCgoAAAACH+PUNvcHlyaWdodCAoQykgMTk5
NSBJRVRGLiBVbmF1dGhvcml6ZWQgZHVwbGljYXRpb24gcHJvaGliaXRlZC4A
etc...

--boundary-example
;这里是相对地址
Content-Location: images/ietflogo2.gif
Content-Transfer-Encoding: BASE64

R0lGODlhGAGgAPEAAP/////ZRaCgoAAAACH+PUNvcHlyaWdodCAoQykgMTk5
NSBJRVRGLiBVbmF1dGhvcml6ZWQgZHVwbGljYXRpb24gcHJvaGliaXRlZC4A
etc...

--boundary-example
Content-Location:http://www.ietf.cnri.reston.va.us/images/ietflogo3.gif
Content-Transfer-Encoding: BASE64

R0lGODlhGAGgAPEAAP/////ZRaCgoAAAACH+PUNvcHlyaWdodCAoQykgMTk5
NSBJRVRGLiBVbmF1dGhvcml6ZWQgZHVwbGljYXRpb24gcHJvaGliaXRlZC4A
etc...
;注意这里是结束标记,表示MHTML文件已经结束了.在定义的分隔符前后都加上”--”
--boundary-example—

      上面是标准的MHTML文件格式,但是按上面的标准是无法在IE里面正确浏览的。还需要注意以下几点:

1. 凡是文本类型的文件所有的”=”替换成”=3D”,例如
<IMG SRC="images/ietflogo3.gif" ALT="IETF logo3">
要替换成
<IMG SRC=3D"images/ietflogo3.gif" ALT=3D"IETF logo3">
2. 所有的BASE64编码的文件必须要换行;
3. 每个文件开头的分隔符要在前加上”--”,而最后一个分隔符要在前后加上”--”;
4. 正文与文件头和下一个文件的分割符都要有换行符。

      废话就说这么说了。接下来还是看看具体实现的代码。