目录
前言
转折
技术论证
案例
hhp
hhc
hhk
节点准备
注意
1.html
2.html
生成chm
软件环境
必备插件
生成chm
搜索
前言
这篇文章其实三年前就想写了,因为当时我自己也遇到了需要通过java生成chm的诉求。自己也是查遍了网上的几乎所有的资料:
- 所有的国内的网站的资料
- 能触摸的到的外网资料
- 微软被我翻了一个底朝天
- 历时3天
上面描述的是我为了找到Java生成chm所做的努力。但是尽管如此,仍然没有找到。
后面在网上的一个角落(具体哪里忘记了),找到了基于c#生成chm的部分思路,但是,就算我想曲线救国,发现这个思路也是不可行的。
转折
这个时候,我想起了一个软件:为知笔记(又名印象笔记),声明下哈,我不是打广告,O(∩_∩)O哈哈~。
为知笔记,有一个功能就是导出chm的功能,只是他是桌面应用。我就想着,至少人家可以通过程序来控制生成chm。于是,我就开始研究为知笔记在我们本地的安装包,经过一番研究,我找到了为知笔记生成chm的代码,虽然代码我看不懂,但是他们的逻辑我还是能看的懂的。提炼了下他们的逻辑:
- 根据所有的节点,生成所有要被生成chm的html
- 根据节点和节点上下级关系,生成hhc文件和hhk文件
- 根据要生成的chm的一些基本信息,生成hhp文件
- 调用hhc.exe将hhp、hhc、hhk以及html打包生成chm
技术论证
经过上面准备动作,我就开始研究hhc文件、hhk文件、hhp文件生成的规则了。
说明:在制作过程中用到了.hhp、.hhk和.hhc三种文件,它们的作用分别如下:
.hhp:保存项目文件配置的有关内容,如 以后生成chm的语言以及打开chm的起始页;
.hhk:保存关键词索引目录的内容,其实是一个html文件,可以用记事本等打开查看和编辑。
.hhc:保存内容页的配置。其实是一个html文件,可以用记事本等打开查看和编辑。
通过记事本查看上面文件的内容之后,如果我们以网页的标题作为索引关键词,我们会发现.hhk和.hhc,这样可以直接copy,省去很多步骤。
案例
举一个例子来解释,下面是一个我们想要生成的chm的效果图:
可以看到,这个chm的标题为chm(左上角),然后有三个节点,其中一个父节点,两个子节点。
那么这样的chm的hhp hhk hhc文件长什么样:
hhp
首先hhp文件,我们取名为rqn.hhp,源代码如下:
[OPTIONS]
Compatibility=1.1 or later
Compiled file=chm.chm
Contents file=rqn.hhc
Default topic=1.html
Display compile progress=No
Full-text search=Yes
Index file=rqn.hhk
Language=2052
Default Font=Arial,8,134
Title=chm
[INFOTYPES]
[FILES]
代码解释:
[OPTIONS]--固定写法
Compatibility=1.1 or later--固定写法
Compiled file=chm.chm--配置要生成的文件的名称,后缀名一定是.chm,文件名称可以自定义
Contents file=rqn.hhc--配置hcc文件路径(这样写,表示就在当前hhp所在的文件夹里头),这边指定hhc文件是rqn.hhc,因此后面hhc文件必须取名rqn.hhc,这个名字可以修改。rqn.hhc配置chm里头每个节点的标题,以及节点对应的html的文件路径,之后生成的chm,点击某个节点的时候,打开的就是这个html的内容
Default topic=1.html--配置chm刚打开要显示的内容所在的文件路径
Display compile progress=No--固定写法,表示不显示编译过程,如果需要显示,就改成Yes
Full-text search=Yes--固定写法,表示是否需要全文搜索,就是不仅可以搜索节点标题,节点内容也要一起搜索。如果不需要,就设置成No
Index file=rqn.hhk--配置hhk文件路径(这样写,表示就在当前的hhk所在的文件夹里头),这边指定hhk文件是rqn.hhk,因此后面hhk文件必须取名rqn.hhk,这个名字可以修改。rqn.hhk配置chm里头需要被搜索的文件的路径(通常只搜索叶子节点,文件夹节点不搜索)
Language=2052--固定写法
Default Font=Arial,8,134--固定写法
Title=chm--配置生成的chm的左上角的标题[INFOTYPES]
[FILES]
hhc
首先hhc,我们因为上面配置了,所以只能取名rqn.hhc,源码如下:
<html><head/><body><OBJECT type="text/site properties"><param name="ImageType"value="Folder">
</OBJECT><ul><li><object type="text/sitemap"><param name="Name" value="一级标题"/></object></li><ul><li><object type="text/sitemap"><param name="Name" value="二级标题"/><param name="Local" value="1.html"/></object></li><li><object type="text/sitemap"><param name="Name" value="2.1标题"/><param name="Local" value="2.html"/></object></li></ul></ul></body></html>
格式陷阱
很多人看傻了,为啥不格式化一下,注意了,还只能是这种格式,格式化一下,或者稍微调整成层次结构,在生成过程都会报错。
格式可以这么理解:
固定第一行:
<html><head/><body><OBJECT type="text/site properties"><param name="ImageType"value="Folder">
剩余的放在第二行。
不要挣扎,我尝试了很多次,只有这种格式不会报错。
不过为了看懂层次组成,可以格式化之后看,但是写的时候必须按照这种格式来做。
hhk
首先hhk,我们因为上面配置了,所以只能取名rqn.hhk,源码如下:
<html><head/><body><ul><li><object type="text/sitemap"><param name="Name" value="二级标题"/><param name="Local" value="1.html"/></object></li><li><object type="text/sitemap"><param name="Name" value="2.1标题"/><param name="Local" value="2.html"/></object></li></ul></body></html>
格式必须按照这种格式来走,不然一样会出问题哈。
至此,上面为生成chm准备好了所有的资料了。下面分享怎么生成chm。
节点准备
上面的hhp里头的配置的要打开的文件,已经在hhk和hhc配置的文件,都是要我们提前准备好的。
在案例里头,我们只用到两个叶子节点(叶子节点才有关联的文件,文件夹点击无效)。
因此我们准备好这两个文件:
注意
html有几个要注意的点
- title标签的内容要跟hhc以及hhk文件里头配置的节点的名称要一样
- 必须将编码设置成GB2312,不要设置成其他编码
- 设置成UTF-8,会导致chm中文内容搜索不了
- 设置成GBK,会导致...(时间过去太久了,忘记了)
- dto建议设置成<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML Strict//EN">,别问为什么,都是辛酸史
- html文件放置的位置一定要跟hhc hhk hhp里头配置的能对的上,不然很找不到文件,生成chm就会报错
1.html
直接上源代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML Strict//EN"><html lang="zh-CN"><head> <title>二级标题</title><meta http-equiv="Content-Type" content="text/html; charset=GB2312" /><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" /></head><body><h1>二级标题内容 不重复内容:非常好</h1></body></html>
2.html
直接上代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML Strict//EN"><html lang="zh-CN"><head> <title>2.1标题</title><meta http-equiv="Content-Type" content="text/html; charset=GB2312" /><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" /></head><body><h1>2.1级标题内容 不重复内容:我是中国人</h1></body></html>
生成chm
软件环境
必须安装html help workshop,我在写博客的时候发现,好像微软已经不提供下载html help workshop了。网上找也没有找到干净的资源,所以我自己上传了:html help workshop
如果不安装,就直接生成chm,会报各种各样的错误,比如:
Error: The file Itircl.dll has not been registered correctly
这个时候你要是拿着这个错误上网搜索答案,会找到各种各样的答案,但是这些答案都解决不了问题的,因为我试了好多方案。O(∩_∩)O哈哈~
必备插件
生成chm必须使用hhc.exe和hha.dll,不然实现不了。
我把资源也上传了:hhc hha插件
将资源解压缩,如下:
将两个文件拷贝出来,放到准备好的文件里头,如下:
生成chm
在当前的文件夹里头,打开cmd,然后输出命令:
hhc.exe rqn.hhp
过一会儿就生成了chm了:
打开chm,效果跟案例的截图就一样了。
搜索
生成chm之后,电子书就生成了,那么搜索功能是一定少不了的。按照上面我的配置来做,那么恭喜你们,生成的chm就是可以支持中文的全文搜索电子书了。
比如:
下一篇讲解下,如何利用java代码来动态生成chm。