在网页中显示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 多个工作薄不是 ...
随机推荐
- iOS学习笔记——基础控件(上)
本篇简单罗列一下一些常用的UI控件以及它们特有的属性,事件等等.由于是笔记,相比起来不会太详细 UIView 所有UI控件都继承于这个UIView,它所拥有的属性必是所有控件都拥有,这些属性都是控件最 ...
- 【C#】在窗体中水平居中的控件,到了XP下不居中的解决办法
我时不时会遭遇这个操蛋问题,今天得闲研究了一下,解决如下: A.将窗体FormBorderStyle属性改为Fixed系,当然这会导致用户不能拖拉窗口大小,所以你可能需要B计划↓ B.确保在[VS]中 ...
- HTML5中的sessionStorage和localStorage
html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage. sessionStorage用于本地存储一个会话(session)中的数据,这些数据只 ...
- 简单的mysql查询
mysql是基于客户机-服务器的数据库.客户机-服务器应用分为两个不同的部分.服务器部分是负责所有数据访问和处理的一个软件. 连接mysql 要连接mysql需要知道如下 主机名: 本地为localh ...
- 【局部特征】ASIFT
由于相机正面白摄物体时,相机的光轴方向可能发生变化,带来扭曲.而SIFT算法虽具有完全的尺度不变性,但不具有完全的仿射不变性,对拍摄角度发生大角度空间变化的图像特征提取有一定的局限性.ASift通过模 ...
- TestNG官方文档中文版(2)-annotation
TestNG的官方文档的中文翻译版第二章,原文请见 http://testng.org/doc/documentation-main.html 2 - Annotation 这里是TestNG中用到的 ...
- 网上图书商城2--Category模块
sql CREATE TABLE `t_category` ( `cid` char(32) NOT NULL, `cname` varchar(50) DEFAULT NULL, `pid` cha ...
- 学习hadoop遇到的问题
1.运行hadoop的帐号,需要多大的权限? 之前实验用的帐号是root,后来新建了个普通帐号,发觉不能直接套用到已经建立好的hadoop系统,因为无权限,即使将普通帐号加入到root群组仍然存在异常 ...
- Glide.js:响应式 & 触摸友好的 jQuery 滑块插件
Glide.js 是一款响应式和对触摸友好的 jQuery 滑块.基于 CSS3 转换实现,并在低版本浏览器降级处理.Glide.js 简单,重量轻,快速,适用于智能手机,平板电脑和台式机.它支持 s ...
- 如何设置'REUSE_ALV_GRID_DISPLAY'的单个单元格的颜色
REPORT ydemo_rick_a . TYPE-POOLS: slis. , carrid LIKE sflight-carrid, connid LIKE sflight-connid, fl ...