使用java代码将html文件转换成chm文件
需求背景:将数据库文档生成一个chm文件;现有两张表一张表里面是所有表的分类/分级(所有的表会组成一个目录,子节点就是具体的表,目录就是分类),另一张表里面是所有表的字段信息
辅助工具:HTML Help Workshop (是否必须安装还不确定)
步骤:
1、根据数据库中的信息生成对应的目录结构 (这里主要是做一次迭代);生成目录结果

2、构造html文件。这个就很就很简单了,根据自己的需要做成自己想要的html样式就好了。
3、生成HHP、HHC、HHK文件。生成方式也很简单,就是组装字符串;主要说的是这几个文件的结构。
HHC文件控制最终生成的chm文件的目录结构,及目录的顺序。
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> <HTML> <HEAD> <meta name="GENERATOR" content="EasyCHM.exe www.zipghost.com"> <!-- Sitemap 1.0 --> </HEAD> <BODY> <OBJECT type="text/site properties"> <param name="ExWindow Styles" value="0x200"> <param name="Window Styles" value="0x800025"> <param name="Font" value="MS Sans Serif,9,0"> </OBJECT> <UL> <LI><OBJECT type="text/sitemap"> <param name="Name" value="分类(10)"> <param name="ImageNumber" value="1"> </OBJECT> <UL> <LI><OBJECT type="text/sitemap"> <param name="Name" value="具体表(100000003).html"> <param name="Local" value="分类(10)\具体表(100000003).html"> <param name="ImageNumber" value="9"> </OBJECT> <LI><OBJECT type="text/sitemap"> <param name="Name" value="具体表(100000004).html"> <param name="Local" value="分类(10)\具体表(100000004).html"> </OBJECT> </UL> <LI><OBJECT type="text/sitemap"> <param name="Name" value="分类(11)"> <param name="ImageNumber" value="1"> </OBJECT> <UL> <LI><OBJECT type="text/sitemap"> <param name="Name" value="具体表(100000005).html"> <param name="Local" value="分类(11)\具体表(100000005).html"> <param name="ImageNumber" value="9"> </OBJECT> <LI><OBJECT type="text/sitemap"> <param name="Name" value="具体表(100000006).html"> <param name="Local" value="分类(11)\具体表(100000006).html"> </OBJECT> </UL> </UL> </BODY> </HTML>
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中的保持一致
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> <HTML> <HEAD> <meta name="GENERATOR" content="EasyCHM.exe www.zipghost.com"> <!-- Sitemap 1.0 --> </HEAD> <BODY> <UL> <LI><OBJECT type="text/sitemap"> <param name="Name" value="具体表(100000003).html"> <param name="Local" value="分类(10)\具体表(100000003).html"> </OBJECT> <LI><OBJECT type="text/sitemap"> <param name="Name" value="具体表(100000004).html"> <param name="Local" value="分类(10)\具体表(100000004).html"> </OBJECT> <LI><OBJECT type="text/sitemap"> <param name="Name" value="具体表(100000005).html"> <param name="Local" value="分类(11)\具体表(100000005).html"> </OBJECT> <LI><OBJECT type="text/sitemap"> <param name="Name" value="具体表(100000006).html"> <param name="Local" value="分类(11)\具体表(100000006).html"> </OBJECT> </UL> </BODY> </HTML>
遍历目录的代码:
public static HHCmodel findAllFile() { String path = "F:\\download\\test"; //要遍历的路径 File file = new File(path); //获取其file对象 HHCmodel model = new HHCmodel(); showDir(file, model); return model; } public static void showDir(File dir, HHCmodel model) { if(dir.exists()){ //抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件和目录。 File[] files = dir.listFiles(); if(null!=files){ List<HHCmodel> modelList = new ArrayList<HHCmodel>(files.length); for (int i = 0; i < files.length; i++) { HHCmodel mo = new HHCmodel(); 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 void main(String[] args) { List<HHCmodel> 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) {
}
}
package test_project.auto; import java.util.Collections; import java.util.Comparator; import java.util.List; public class HHCmodel { private String num; private String name; private boolean isFile; private String relative_path; private String abslout_path; private List<HHCmodel> modelList; public List<HHCmodel> sortFiled() { if(null == this.modelList || this.modelList.size() < 1) { return modelList; } Collections.sort(this.modelList, new Comparator<HHCmodel>() { @Override public int compare(HHCmodel o1, HHCmodel o2) { return o1.getNum().compareTo(o2.getNum()); } }); return modelList; } public String getAbslout_path() { return abslout_path; } public void setAbslout_path(String abslout_path) { this.abslout_path = abslout_path; } public String getNum() { return num; } public void setNum(String num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isFile() { return isFile; } public void setFile(boolean isFile) { this.isFile = isFile; } public String getRelative_path() { return relative_path; } public void setRelative_path(String relative_path) { this.relative_path = relative_path; } public List<HHCmodel> getModelList() { return modelList; } public void setModelList(List<HHCmodel> modelList) { this.modelList = modelList; } }
生成的文件的样子:

调用 HTML Help Workshop中的hhc.exe
public static void main(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 = new InputStreamReader(stdin); BufferedReader br = new BufferedReader(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

浙公网安备 33010602011771号