天天看点

C#生成CHM文件

HTML Help Workshop介绍:微软出品的HTML Help WorkShop制作chm文件的最佳工具。

(下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=21138)

(HTML HELP WORKSHOP教:http://wenku.baidu.com/view/a90adbd249649b6648d74794.html)

本文,我们将用编程的方法来实现将html文件编译成CHM文件。在开始编程之前,我们有必要了解下HTML Help Workshop是怎么生成CHM的。

HTML Help Workshop编译成CHM文件需要如下三个文件,分别以hhp,hhc,hhk为文件后缀名。

hhp:CHM工程文件,CHM目标文件属性95%的参数都在这里被确定.

hhc,列表文件,确定目标文件中左侧树形列表中"目录"选项卡下的内容.

hhk,索引文件,确定目标文件中左侧树形列表中"索引"选项卡下的内容.

hhp几乎就是一个标准的ini文件.分为三个小节Option,Windows,Files.

典型的配置文件(test.hhp)结构如下:

[OPTIONS]
Title= test
Compatibility=1.1 or later
Default Window=Main
Default topic=index.html
Display compile progress=No
Language=0x804 中文(中国)

[WINDOWS]
Main=test","test.hhc","test.hhk","index.html","index.html",,,,,0x20,180,0x104E,[80,60,720,540],0x0,0x0,,,,,0

[FILES]
           

内容页项目资源(test.hhc)文件结构如下:

DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="Microsoft? HTML Help Workshop 4.1">

HEAD>
<BODY>
<OBJECT type="text/site properties">
<param name="Window Styles" value="0x237">
OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="NewTopic">
OBJECT>
<UL>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="NewTopic">
<param name="Local" value="NewTopic.html">
OBJECT>
UL>
UL>
BODY>
HTML>
           

引文件(test.hhk))也是一个HTML文件,它包含若干个关键词,当用户打开chm文件后,单击索引标签并输入一个关键词后,chm文件将显示与这个关键词有关的主题的列表,使大家非常方便地找到相关主题。 典型的文件结构如下:

DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="Microsoft? HTML Help Workshop 4.1">
 
HEAD>
<BODY>
<UL>
 <LI> <OBJECT type="text/sitemap">
 <param name="Name" value="NewTopic">
 <param name="Local" value="NewTopic.html">
 OBJECT>
UL>
BODY>
HTML>
           

将在线网页保存为chm文件 代码如下:

protected void Page_Load(object sender, EventArgs e)
    {
        CreateIndexHtml();  
        CreateCHM(@"D:\Program Files (x86)\HTML Help Workshop\hhc.exe");//生成CHM文件
      
    }
    /// <summary>
    /// 将百度的首页下载到本地
    /// </summary>
    private void CreateIndexHtml() {
        string url = "http://www.baidu.com";
        HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);
        HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse();
        StreamReader respStream = new StreamReader(myResp.GetResponseStream(), Encoding.Default);
        string respStr = respStream.ReadToEnd();
        respStream.Close();
        FileStream fs = new FileStream(Request.PhysicalApplicationPath + @"\index.html", FileMode.Create, FileAccess.Write);
        StreamWriter sw = new StreamWriter(fs, Encoding.Default);
        sw.Write(respStr);
        sw.Close();
    
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="hhcFileUrl">HTML Help Workshop安装后hhc.exe文件的路径</param>
    /// <returns></returns>
    private bool CreateCHM(string hhcFileUrl)
    {
        Process helpCompileProcess = new Process(); //创建新的进程,用Process启动HHC.EXE来Compile一个CHM文件
        try
        {
            ProcessStartInfo processStartInfo = new ProcessStartInfo();
            processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            processStartInfo.FileName = hhcFileUrl; //调入HHC.EXE文件 
            processStartInfo.Arguments = "\"" + Path.GetFullPath(Request.PhysicalApplicationPath + @"\test.hhp") + "\"";//获取先前做好的HHP(里面会引用hhc.hhk等文件)文件
            processStartInfo.UseShellExecute = false;
            helpCompileProcess.StartInfo = processStartInfo;
            helpCompileProcess.Start();
            helpCompileProcess.WaitForExit(); //组件无限期地等待关联进程退出

            if (helpCompileProcess.ExitCode == 0)
            {
                Response.Write(new Exception().Message);
                return false;
            }
        }
        finally
        {
            helpCompileProcess.Close();
        }
        return true;
    }
           
C#生成CHM文件