史上最强Java生成chm的教程(上)

目录

 

前言

转折

技术论证

案例

hhp

hhc

hhk

节点准备

注意

1.html

2.html

生成chm

软件环境

必备插件

生成chm

搜索


前言

这篇文章其实三年前就想写了,因为当时我自己也遇到了需要通过java生成chm的诉求。自己也是查遍了网上的几乎所有的资料:

  1. 所有的国内的网站的资料
  2. 能触摸的到的外网资料
  3. 微软被我翻了一个底朝天
  4. 历时3天

上面描述的是我为了找到Java生成chm所做的努力。但是尽管如此,仍然没有找到。

后面在网上的一个角落(具体哪里忘记了),找到了基于c#生成chm的部分思路,但是,就算我想曲线救国,发现这个思路也是不可行的。

转折

这个时候,我想起了一个软件:为知笔记(又名印象笔记),声明下哈,我不是打广告,O(∩_∩)O哈哈~。

为知笔记,有一个功能就是导出chm的功能,只是他是桌面应用。我就想着,至少人家可以通过程序来控制生成chm。于是,我就开始研究为知笔记在我们本地的安装包,经过一番研究,我找到了为知笔记生成chm的代码,虽然代码我看不懂,但是他们的逻辑我还是能看的懂的。提炼了下他们的逻辑:

  1. 根据所有的节点,生成所有要被生成chm的html
  2. 根据节点和节点上下级关系,生成hhc文件和hhk文件
  3. 根据要生成的chm的一些基本信息,生成hhp文件
  4. 调用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有几个要注意的点

  1. title标签的内容要跟hhc以及hhk文件里头配置的节点的名称要一样
  2. 必须将编码设置成GB2312,不要设置成其他编码
    1. 设置成UTF-8,会导致chm中文内容搜索不了
    2. 设置成GBK,会导致...(时间过去太久了,忘记了)
  3. dto建议设置成<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML Strict//EN">,别问为什么,都是辛酸史
  4. 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

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独行侠_阿涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值