史上最强Java生成chm的教程(上)
目录
前言
转折
技术论证
案例
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。
史上最强Java生成chm的教程(上)相关推荐
- 史上最强——JAVA基础知识汇总
1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具和jre. 2,JRE:Java Runtime Environment,java程序的运行环境,ja ...
- 金九银十,史上最强 Java 面试题整理。
以下会重新整理所有 Java 系列面试题答案.及各大互联网公司的面试经验,会从以下几个方面汇总,本文会长期更新. Java 面试篇 史上最全 Java 面试题,带全部答案 史上最全 69 道 Spri ...
- 史上最强Java架构师的13大技术能力讲解! | 附架构师能力图谱
从程序员进阶成为架构师,并非一蹴而就,需要系统化.阶段性地学习,在实战项目中融会贯通,这如同打怪通关,我们得一关一关突破,每攻破一个关口,就能得到更精良的装备,技能值也随之不断增长,直至大获全胜. 凡 ...
- 史上最强Java学习路线
Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了,但有一些一般的步骤: 熟悉一种文本编辑器,比如:Vim, Emacs, Notepad++, TextMate等.知道哪些是 ...
- 史上最强Java学习路线(详解)
Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了,但有一些一般的步骤: 熟悉一种文本编辑器,比如:Vim, Emacs, Notepad++, TextMate等.知道哪些是 ...
- 详解 | 史上最强Java学习路线
Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了,但有一些一般的步骤: 熟悉一种文本编辑器,比如:Vim, Emacs, Notepad++, TextMate等.知道哪些是 ...
- 老夫花了 3 天时间整理了一份史上最强 Java 学习路线图,送给有缘人!
趁热打铁,二哥就来给需要的同学准备一份新鲜出炉的 Java 学习路线图吧,送给有缘人. 第一部分:Java 基础篇 这个阶段就是编程入门,掌握 Java 这门编程语言的基本语法,为后面的修行之路打好基 ...
- 史上最全Java面试题全集(上)
转载自 Java面试题全集(上)!(速度收藏) 2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有 ...
- Arthas使用教程 阿里巴巴开源项目、史上最强java线上诊断工具
什么是 Arthas 摘录一段官方 Github 上的简介 Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决: 这 ...
- 史上最强Java八股文面试题,堪称2023最强!!!
前言 很多同学会问Java面试八股文有必要背吗? 我的回答是:很有必要.你可以讨厌这种模式,但你一定要去背,因为不背你就过不了. 国内的互联网面试,恐怕是现存的.最接近科举考试的制度. 而且,我国的八 ...
最新文章
- Kotlin教程(九)泛型
- Android内核开发:学会分析系统的启动log
- mysql二进制安装的优缺点_MYSQL的二进制安装
- 2020牛客多校2 - Exclusive OR(FWT)
- Linux 系统应用编程——进程基础
- Spring web应用最大的败笔
- Python数据类型--字典
- 神奇的go语言(网页下载)
- 设置checkbox的只读
- 微型计算机远程编程微软,用微软的云计算来远程管理自己的电脑
- 现代通信原理10.2:采用匹配滤波器的数字基带传输系统误码性能分析
- android 通讯录恢复,通讯录恢复
- 在低版本浏览器内核中适配replaceAll
- 使用Google搜索引擎的10个搜索技巧
- 阿里云服务器延迟多少?测一下
- 义隆单片机学习笔记之(二) 指令系统
- 游戏美术次世代制作流程图文详解
- Mavenir推出智能物联网平台以实现更智能的分析
- vm虚拟机安装教程及注意事项
- OD-火星文计算(Python)