CHM即“已编译的帮助文件”,主要由.hhc(目录文件)、.hhk(索引文件)以及相应的帮助主题文件(.html,.htm)这些内容编译而成。

方法对比

在网页中显示CHM内容,大致有以下几种办法:

  1. 使用某些工具来反编译,把CHM文件还原成以上相关的文件,并通过hhc文件来列出目录,内容链接到相应的html文件
  2. 依然是反编译这些文件,把相关目录及html文件内容直接存到数据库中
  3. 直接解析chm文件

这些方法有优点也有缺点:

  1. 方法1的优点是方便快捷;缺点也很明显,分散的html不便于管理也不利于搜索
  2. 方法2的优点是直接存在数据库,查询方便;需要通过遍历目录把结构和内容插入到数据库,以及重新组织图片资源文件的位置,稍微有点繁琐而已
  3. 方法3的优点是不需要反编译,直接使用最方便;缺点是,解析chm难度太高

个人认为直接存入数据库是相对较好的办法,但这不是本文的目的,本文使用直接解析CHM文件的方式。

使用开源类库

本文主要使用Codeproject上的一个开源类库:http://www.codeproject.com/KB/cs/htmlhelp.aspx,并针对web稍加改造。

这个htmlhelp类库包括了几乎hh.exe(即windows桌面版的chm查看器)所有功能,可以说是非常强大。

但它有一个问题,对于不标准的chm文件,搜索功能支持不太好,猜测可能也是编码有关系

我试了好多工具来生成CHM文件,但都无法很好的使用它的搜索功能;好在它解析CHM文件的时候,同时也把所有的主题文件(.htm,.html)都读取出来了,所以可以通过这些内容以及标题来改造一下搜索功能,以适应我的不标准的CHM文件。

搜索功能主要改造主要代码如下:

public bool SearchTopics(string key, TreeView treeview)
{
return SearchTopics(key, treeview, true);
} public bool SearchTopics(string key, TreeView treeview, bool filterHtml)
{
ArrayList result = new ArrayList();
SearchTopic(key, result, chmHelp.TableOfContents.TOC, filterHtml);
bool hasData = result.Count > 0;
if (hasData)
{
treeview.Nodes.Clear();
foreach (TOCItem item in result)
{
TreeNode node = new TreeNode(item.Name);
node.NavigateUrl = urlPrefix + item.Local;
treeview.Nodes.Add(node);
}
}
return hasData;
} static Regex reHtmlFilter = new Regex("<[^>]*>", RegexOptions.Compiled); private void SearchTopic(string topic, ArrayList result, ArrayList searchIn, bool filterHtml)
{
foreach (TOCItem curItem in searchIn)
{
if (curItem.Children.Count == 0)
{
string temp = curItem.FileContents;
if (filterHtml && !string.IsNullOrEmpty(temp))
{
temp = reHtmlFilter.Replace(temp, string.Empty);
}
if ((!string.IsNullOrEmpty(curItem.Name) && curItem.Name.Contains(topic)) ||
(!string.IsNullOrEmpty(temp) && temp.Contains(topic)))
{
result.Add(curItem);
}
}
else
{
SearchTopic(topic, result, curItem.Children, filterHtml);
}
}
}

对于获取单个主题,htmlhelp只提供了通过标题搜索,但考虑到标题可能不唯一,所以本文也增加了通过url来搜索。

单独创建一个页面,通过接收url来获取相应的主题,并显示出来;在此也要注意,url可能存在一些特殊字符如“#”、“%20”等符号,导致参数不能正确传递的问题。

预览:

代码不多贴了,完整的例子:点击下载

在网页中显示CHM (c# csharp .net asp.net winform)的更多相关文章

  1. 网页中显示pdf

    1.<embed width="800" height="600" src="test_pdf.pdf"> </embed ...

  2. 非常好的在网页中显示pdf的方法

    今天有一需求,要在网页中显示pdf,于是立马开始搜索解决方案,无意中发现一个非常好的解决方法,详见http://blogs.adobe.com/pdfdevjunkie/web_designers_g ...

  3. Flash设置全屏后,放到网页中显示不正常

    stage.displayState = StageDisplayState.FULL_SCREEN;//全屏,注意当设置全屏后,放到网页中显示不正常

  4. Emoji表情在网页中显示

    最近遇到一个项目,客户手机上发送的表情要在电脑网页中显示,没有找到简便方法,于是有了以下方案. 由于Emoji表情传到后台是“口”,怎么找出接收数据中的表情是关键,各种搜索后,我用下面的正则表达式匹配 ...

  5. 网页中显示pdf的方法

    非常好的在网页中显示pdf的方法 今天有一需求,要在网页中显示pdf,于是立马开始搜索解决方案,无意中发现一个非常好的解决方法,详见http://blogs.adobe.com/pdfdevjunki ...

  6. 如何在浏览器网页中显示word文件内容

    如何在浏览器网页中显示word文件内容 把word文件读到byte[]中,再Response.OutputStream.Write(bytes)到客户端去 Page_Load事件中写: //FileS ...

  7. 网页中显示xml,直接显示xml格式的文件

    第一种方法 使用<pre></pre>包围代码(在浏览器中测试不行啊,但是在富编辑器中又可以,怪):使用<xmp></xmp>包围代码(官方不推荐,但是 ...

  8. 如何把报表放到网页中显示(Web页面与报表简单集成例子)

    1.问题描述 现在用户开发的系统基本上趋向于BS架构的浏览器/服务器模式,这些系统可能由不同的语言开发,如HTML.ASP.JSP.PHP等,因此需要将制作好的报表嵌入到这些页面中. FineRepo ...

  9. office 文件在网页中显示

    1.如何在网页上显示word和excel a.可以使用office组件或aspose将word 和excel 转换为pdf 然后在网页上打开pdf,但是效果不是很好 .比如说excel 多个工作薄不是 ...

随机推荐

  1. 速战速决 (2) - PHP: 数据类型 bool, int, float, string, object, array

    [源码下载] 速战速决 (2) - PHP: 数据类型 bool, int, float, string, object, array 作者:webabcd 介绍速战速决 之 PHP 数据类型 boo ...

  2. Linux命令速查手册,超详细Linux命令教程

    一.常用命令速查 ls cd pwd cat more less tail head cp scp mv mkdir rmdir touch rm ps kill top free clear tre ...

  3. 详解spring 每个jar的作用

    spring.jar 是包含有完整发布模块的单个jar 包.但是不包括mock.jar, aspects.jar, spring-portlet.jar, and spring-hibernate2. ...

  4. GJM : 数据结构 - 轻松看懂机器学习十大常用算法 [转载]

     转载请联系原文作者 需要获得授权,非法转载 原文作者将享受侵权诉讼 文/不会停的蜗牛(简书作者)原文链接:http://www.jianshu.com/p/55a67c12d3e9 通过本篇文章可以 ...

  5. 开源日志记录工具log4j

    前言:当我们进行大的项目书写的时候或者我们选择维护程序的时候,想知道几点几时我们录入的数据有bug是那么我们就采用--------------------------->log4j记录日志的信息 ...

  6. HBase集群安装过程中的问题集锦

    1.HRegionServer启动不正常 在namenode上执行jps,则可看到hbase启动是否正常,进程如下: [root@master bin]# jps26341 HMaster26642 ...

  7. js的动态加载、缓存、更新以及复用(四)

    本来想一气呵成,把加载的过程都写了,但是卡着呢,所以只好在分成两份了. 1.页面里使用<script>来加载 boot.js . 2.然后在boot.js里面动态加载 bootLoad.j ...

  8. jquery多次上传同一张图片

    $().reset(); wrap():$('p').wrap('div');===><div><p></p></div>; .closest() ...

  9. 你会喜欢的25个创意的扁平化 LOGO 设计

    扁平设计的风暴席卷了整个设计领域,它不仅影响网页设计,也影响了用户界面和标志设计.最近,我们看到了很多大公司,如谷歌和必应开始使用扁平设计的标识. 一个 LOGO 应该简单,显眼和精美,以适应产品的整 ...

  10. 未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService... 匹配的导出 VS2012报错

    刚安装完VS2012,打开VS2012新建项目,但是并没有像之前那样顺利的创建页面,而是弹出了一个错误窗口. 我的系统是win7旗舰版 64位 ,同时安装了VS2010和VS2012.然后我又试了一下 ...