需求背景:将数据库文档生成一个chm文件;现有两张表一张表里面是所有表的分类/分级(所有的表会组成一个目录,子节点就是具体的表,目录就是分类),另一张表里面是所有表的字段信息
辅助工具:HTML Help Workshop (是否必须安装还不确定)
步骤:
1、根据数据库中的信息生成对应的目录结构 (这里主要是做一次迭代);生成目录结果
2、构造html文件。这个就很就很简单了,根据自己的需要做成自己想要的html样式就好了。
3、生成HHP、HHC、HHK文件。生成方式也很简单,就是组装字符串;主要说的是这几个文件的结构。
HHC文件控制最终生成的chm文件的目录结构,及目录的顺序。
HHP文件 控制chm文件的生成路径;默认显示的首页
[OPTIONS]
CITATION=Made by Easy CHM
Compatibility=1.1 or later
Compiled file=F:\download\test\test.CHM
Contents file=test.HHC
COPYRIGHT=www.eTextWizard.com
Default topic=分类(10)\具体表(100000003).html
Default Window=Easy-CHM-384-TRIAL-5E7AE767
Display compile notes=Yes
Display compile progress=Yes
Error log file=_EasyCHM_ErrorLog.Log
Full-text search=Yes
Index file=test.HHK
Title=Easy CHM - Made by UNREGISTERED version of Easy CHM
[WINDOWS]
Easy-CHM-384-TRIAL-5E7AE767="Easy CHM - Made by UNREGISTERED version of Easy CHM","test.HHC","test.HHK","分类(10)\具体表(100000003).html","分类(10)\具体表(100000003).html",,"About",,,0x63520,271,0x4304E,[0,0,745,509],,,,,,,0
[MERGE FILES]
[FILES]F:\download\test\分类(10)\具体表(100000003).html
F:\download\test\分类(10)\具体表(100000004).html
F:\download\test\分类(11)\具体表(100000005).html
F:\download\test\分类(11)\具体表(100000006).html
HHK文件 hhk文件中的数据顺序要与hhp中的保持一致
遍历目录的代码:
public staticHHCmodel findAllFile() {
String path= "F:\\download\\test"; //要遍历的路径
File file = new File(path); //获取其file对象
HHCmodel model = newHHCmodel();
showDir(file, model);returnmodel;
}public static voidshowDir(File dir, HHCmodel model) {if(dir.exists()){//抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件和目录。
File[] files =dir.listFiles();if(null!=files){
List modelList = new ArrayList(files.length);for (int i = 0; i < files.length; i++) {
HHCmodel mo= newHHCmodel();
mo.setName(files[i].getName());
mo.setNum(files[i].getName().substring(files[i].getName().lastIndexOf("(") + 1, files[i].getName().lastIndexOf(")")));
mo.setAbslout_path(files[i].getAbsolutePath());if(null !=model.getRelative_path()) {
mo.setRelative_path(model.getRelative_path()+ "\\" +files[i].getName());
}else{
mo.setRelative_path(files[i].getName());
}if(files[i].isDirectory()) {
mo.setFile(false);
showDir(files[i],mo);
}else{
mo.setFile(true);
}
modelList.add(mo);
}
model.setModelList(modelList);
}
}
}
public static voidmain(String[] args) {
List model =findAllFile().sortFiled();
writeString2File(connectString(model), "F:\\download\\test\\test.HHC");
}
public static void writeString2File(String str,String filepath) {
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filepath), "GBK"))) {
bw.write(str);
bw.flush();
} catch (Exception e) {
}
}
packagetest_project.auto;importjava.util.Collections;importjava.util.Comparator;importjava.util.List;public classHHCmodel {privateString num;privateString name;private booleanisFile;privateString relative_path;privateString abslout_path;private ListmodelList;public ListsortFiled() {if(null == this.modelList || this.modelList.size() < 1) {returnmodelList;
}
Collections.sort(this.modelList, new Comparator() {
@Overridepublic intcompare(HHCmodel o1, HHCmodel o2) {returno1.getNum().compareTo(o2.getNum());
}
});returnmodelList;
}publicString getAbslout_path() {returnabslout_path;
}public voidsetAbslout_path(String abslout_path) {this.abslout_path =abslout_path;
}publicString getNum() {returnnum;
}public voidsetNum(String num) {this.num =num;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}public booleanisFile() {returnisFile;
}public void setFile(booleanisFile) {this.isFile =isFile;
}publicString getRelative_path() {returnrelative_path;
}public voidsetRelative_path(String relative_path) {this.relative_path =relative_path;
}public ListgetModelList() {returnmodelList;
}public void setModelList(ListmodelList) {this.modelList =modelList;
}
}
生成的文件的样子:
调用 HTML Help Workshop中的hhc.exe
public static voidmain(String[] args) {
Runtime mt=Runtime.getRuntime();try{
Process p= mt.exec("F:\\download\\test\\hhc.exe F:\\download\\test\\test.HHP");
InputStream stdin=p.getInputStream();
InputStreamReader isr= newInputStreamReader(stdin);
BufferedReader br= newBufferedReader(isr);
String line= null;while ((line = br.readLine()) != null)
System.out.println(line);
}catch(IOException e) {
e.printStackTrace();
}
}
这里为了方便观看,将hhc.exe放在的这个目录。不太确定HTML Help Workshop是不是必须安装,我自己是安装了,但是我将hhc.exe随便移动位置也并不影响执行结果。
在从hhp生成chm的时候会出现乱码的情况,我把编码格式设置成了GBK
参考资料 https://www.cnblogs.com/codealone/archive/2013/03/21/2972426.html