使用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

posted @ 2020-07-07 11:14  笑天下  阅读(1066)  评论(0)    收藏  举报