目录

前言

转折

技术论证

案例

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。

史上最强Java生成chm的教程(上)相关推荐

  1. 史上最强——JAVA基础知识汇总

    1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具和jre. 2,JRE:Java Runtime Environment,java程序的运行环境,ja ...

  2. 金九银十,史上最强 Java 面试题整理。

    以下会重新整理所有 Java 系列面试题答案.及各大互联网公司的面试经验,会从以下几个方面汇总,本文会长期更新. Java 面试篇 史上最全 Java 面试题,带全部答案 史上最全 69 道 Spri ...

  3. 史上最强Java架构师的13大技术能力讲解! | 附架构师能力图谱

    从程序员进阶成为架构师,并非一蹴而就,需要系统化.阶段性地学习,在实战项目中融会贯通,这如同打怪通关,我们得一关一关突破,每攻破一个关口,就能得到更精良的装备,技能值也随之不断增长,直至大获全胜. 凡 ...

  4. 史上最强Java学习路线

    Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了,但有一些一般的步骤: 熟悉一种文本编辑器,比如:Vim, Emacs, Notepad++, TextMate等.知道哪些是 ...

  5. 史上最强Java学习路线(详解)

    Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了,但有一些一般的步骤: 熟悉一种文本编辑器,比如:Vim, Emacs, Notepad++, TextMate等.知道哪些是 ...

  6. 详解 | 史上最强Java学习路线

    Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了,但有一些一般的步骤: 熟悉一种文本编辑器,比如:Vim, Emacs, Notepad++, TextMate等.知道哪些是 ...

  7. 老夫花了 3 天时间整理了一份史上最强 Java 学习路线图,送给有缘人!

    趁热打铁,二哥就来给需要的同学准备一份新鲜出炉的 Java 学习路线图吧,送给有缘人. 第一部分:Java 基础篇 这个阶段就是编程入门,掌握 Java 这门编程语言的基本语法,为后面的修行之路打好基 ...

  8. 史上最全Java面试题全集(上)

    转载自 Java面试题全集(上)!(速度收藏) 2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有 ...

  9. Arthas使用教程 阿里巴巴开源项目、史上最强java线上诊断工具

    什么是 Arthas 摘录一段官方 Github 上的简介 Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决: 这 ...

  10. 史上最强Java八股文面试题,堪称2023最强!!!

    前言 很多同学会问Java面试八股文有必要背吗? 我的回答是:很有必要.你可以讨厌这种模式,但你一定要去背,因为不背你就过不了. 国内的互联网面试,恐怕是现存的.最接近科举考试的制度. 而且,我国的八 ...

最新文章

  1. Kotlin教程(九)泛型
  2. Android内核开发:学会分析系统的启动log
  3. mysql二进制安装的优缺点_MYSQL的二进制安装
  4. 2020牛客多校2 - Exclusive OR(FWT)
  5. Linux 系统应用编程——进程基础
  6. Spring web应用最大的败笔
  7. Python数据类型--字典
  8. 神奇的go语言(网页下载)
  9. 设置checkbox的只读
  10. 微型计算机远程编程微软,用微软的云计算来远程管理自己的电脑
  11. 现代通信原理10.2:采用匹配滤波器的数字基带传输系统误码性能分析
  12. android 通讯录恢复,通讯录恢复
  13. 在低版本浏览器内核中适配replaceAll
  14. 使用Google搜索引擎的10个搜索技巧
  15. 阿里云服务器延迟多少?测一下
  16. 义隆单片机学习笔记之(二) 指令系统
  17. 游戏美术次世代制作流程图文详解
  18. Mavenir推出智能物联网平台以实现更智能的分析
  19. vm虚拟机安装教程及注意事项
  20. OD-火星文计算(Python)

热门文章

  1. rand()函数的用法
  2. Banner图片轮播
  3. 深度学习、机器学习领域毕业设计选题方法及建议
  4. 神经内科常用评估量表,神经功能缺损评分量表
  5. span标签之间的空隙如何解决
  6. 跟着“Science”做张24h 南丁格尔玫瑰图吧
  7. matlab的foramt
  8. R语言利用openxlsx包输出EXCEL报告
  9. 如何从本地硬盘启动计算机,解密:如何在计算机BIOS中设置硬盘启动
  10. 怎么把桌面计算机放到快速启动栏,快速启动栏,教您电脑快速启动栏不见了