在网页中显示CHM (c# csharp .net asp.net winform)
CHM即“已编译的帮助文件”,主要由.hhc(目录文件)、.hhk(索引文件)以及相应的帮助主题文件(.html,.htm)这些内容编译而成。
方法对比
在网页中显示CHM内容,大致有以下几种办法:
- 使用某些工具来反编译,把CHM文件还原成以上相关的文件,并通过hhc文件来列出目录,内容链接到相应的html文件
- 依然是反编译这些文件,把相关目录及html文件内容直接存到数据库中
- 直接解析chm文件
这些方法有优点也有缺点:
- 方法1的优点是方便快捷;缺点也很明显,分散的html不便于管理也不利于搜索
- 方法2的优点是直接存在数据库,查询方便;需要通过遍历目录把结构和内容插入到数据库,以及重新组织图片资源文件的位置,稍微有点繁琐而已
- 方法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)的更多相关文章
- 网页中显示pdf
1.<embed width="800" height="600" src="test_pdf.pdf"> </embed ...
- 非常好的在网页中显示pdf的方法
今天有一需求,要在网页中显示pdf,于是立马开始搜索解决方案,无意中发现一个非常好的解决方法,详见http://blogs.adobe.com/pdfdevjunkie/web_designers_g ...
- Flash设置全屏后,放到网页中显示不正常
stage.displayState = StageDisplayState.FULL_SCREEN;//全屏,注意当设置全屏后,放到网页中显示不正常
- Emoji表情在网页中显示
最近遇到一个项目,客户手机上发送的表情要在电脑网页中显示,没有找到简便方法,于是有了以下方案. 由于Emoji表情传到后台是“口”,怎么找出接收数据中的表情是关键,各种搜索后,我用下面的正则表达式匹配 ...
- 网页中显示pdf的方法
非常好的在网页中显示pdf的方法 今天有一需求,要在网页中显示pdf,于是立马开始搜索解决方案,无意中发现一个非常好的解决方法,详见http://blogs.adobe.com/pdfdevjunki ...
- 如何在浏览器网页中显示word文件内容
如何在浏览器网页中显示word文件内容 把word文件读到byte[]中,再Response.OutputStream.Write(bytes)到客户端去 Page_Load事件中写: //FileS ...
- 网页中显示xml,直接显示xml格式的文件
第一种方法 使用<pre></pre>包围代码(在浏览器中测试不行啊,但是在富编辑器中又可以,怪):使用<xmp></xmp>包围代码(官方不推荐,但是 ...
- 如何把报表放到网页中显示(Web页面与报表简单集成例子)
1.问题描述 现在用户开发的系统基本上趋向于BS架构的浏览器/服务器模式,这些系统可能由不同的语言开发,如HTML.ASP.JSP.PHP等,因此需要将制作好的报表嵌入到这些页面中. FineRepo ...
- office 文件在网页中显示
1.如何在网页上显示word和excel a.可以使用office组件或aspose将word 和excel 转换为pdf 然后在网页上打开pdf,但是效果不是很好 .比如说excel 多个工作薄不是 ...
随机推荐
- 速战速决 (2) - PHP: 数据类型 bool, int, float, string, object, array
[源码下载] 速战速决 (2) - PHP: 数据类型 bool, int, float, string, object, array 作者:webabcd 介绍速战速决 之 PHP 数据类型 boo ...
- Linux命令速查手册,超详细Linux命令教程
一.常用命令速查 ls cd pwd cat more less tail head cp scp mv mkdir rmdir touch rm ps kill top free clear tre ...
- 详解spring 每个jar的作用
spring.jar 是包含有完整发布模块的单个jar 包.但是不包括mock.jar, aspects.jar, spring-portlet.jar, and spring-hibernate2. ...
- GJM : 数据结构 - 轻松看懂机器学习十大常用算法 [转载]
转载请联系原文作者 需要获得授权,非法转载 原文作者将享受侵权诉讼 文/不会停的蜗牛(简书作者)原文链接:http://www.jianshu.com/p/55a67c12d3e9 通过本篇文章可以 ...
- 开源日志记录工具log4j
前言:当我们进行大的项目书写的时候或者我们选择维护程序的时候,想知道几点几时我们录入的数据有bug是那么我们就采用--------------------------->log4j记录日志的信息 ...
- HBase集群安装过程中的问题集锦
1.HRegionServer启动不正常 在namenode上执行jps,则可看到hbase启动是否正常,进程如下: [root@master bin]# jps26341 HMaster26642 ...
- js的动态加载、缓存、更新以及复用(四)
本来想一气呵成,把加载的过程都写了,但是卡着呢,所以只好在分成两份了. 1.页面里使用<script>来加载 boot.js . 2.然后在boot.js里面动态加载 bootLoad.j ...
- jquery多次上传同一张图片
$().reset(); wrap():$('p').wrap('div');===><div><p></p></div>; .closest() ...
- 你会喜欢的25个创意的扁平化 LOGO 设计
扁平设计的风暴席卷了整个设计领域,它不仅影响网页设计,也影响了用户界面和标志设计.最近,我们看到了很多大公司,如谷歌和必应开始使用扁平设计的标识. 一个 LOGO 应该简单,显眼和精美,以适应产品的整 ...
- 未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService... 匹配的导出 VS2012报错
刚安装完VS2012,打开VS2012新建项目,但是并没有像之前那样顺利的创建页面,而是弹出了一个错误窗口. 我的系统是win7旗舰版 64位 ,同时安装了VS2010和VS2012.然后我又试了一下 ...