1、功能需求
1.1、需求明细
1、将word文本转换为html 2、提取三级标题下的H5内容(包括表格、图片) 3、将三级标题内容提取为【一级类型】、【二级类型】
1.2、原word文件样式
参考样例文件:wordSample.docx 提取码:u794
2、设计思路
2.1、利用github开源项目:java-mammoth 实现word2html功能
java-mammoth 项目github链接:https://github.com/mwilliamson/java-mammoth
pom配置信息:
<dependency> <groupId>org.zwobble.mammoth</groupId> <artifactId>mammoth</artifactId> <version>1.4.1</version> </dependency>
2.2、生成的html文件中一级标题、二级标题、三级标题分别为h1、h2、h3标签;利用标签的差异进行字符串处理获取三级标题H5内容
1、接收处理后的段落信息
public class HtmlRecord {
private String type1;
private String type2;
private String key;
private String content;
public String getType1() {
return type1;
}
public void setType1(String type1) {
this.type1 = type1;
}
public String getType2() {
return type2;
}
public void setType2(String type2) {
this.type2 = type2;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
2、html拆分处理逻辑
public static void main(String[] args) {
try{
DocumentConverter converter = new DocumentConverter();
Result<String> result = converter.convertToHtml(new File("D:\\abc.docx"));
String html = result.getValue(); // The generated HTML
getHeadItems(html);
Set<String> warnings = result.getWarnings();
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 获取三级标题内容列表
* @param html word转换生成的html内容
* @return
*/
private static List<HtmlRecord> getHeadItems(String html){
List<HtmlRecord> records = new ArrayList<>();
// 当前一级标题名称
String h1Name = "";
// 当前二级标题名称
String h2Name = "";
// 当前三级标题名称
String h3Name = "";
// 当前三级标题对应内容
String h3Content = "";
// 上一级标题结束下标
int lastEndIndex = 0;
// 上次标签为三级标题
boolean isH3Tag = false;
//String html3 = "<h1>dafa</h1><h2>123456</h2><h2>ddddd</h2><h3>aaaa</h3><a id=\"_Toc518917206\"></a>三、合规管理 <h1><p><strong>云南国际信托有限公司</strong></p></h1><h3>33333</h3><a id=\"_Toc518917206\"></a>三、合规管理";
// 标题标签正则匹配式
Pattern pattern = Pattern.compile("<h[1-3]{1}>(.*?)</[h][1-3]{1}>");
Matcher matcher = pattern.matcher(html);
// 匹配任意三级标题前部分
while(matcher.find()){
//boolean result2 = matcher2.find();
// 三级标题前部分开始下标
int startIndex = matcher.start();
// 三级标题后部分开始下标
int endIndex = matcher.end();
// 获取标题标签之间内容
String tagContent = html.substring(startIndex + 4,endIndex-5);
// 获取标题标签名称
String tag = matcher.group().substring(0,4);
// 上一次为三级标题标签
if(isH3Tag){
// 上次标签后部分结束下标 - 本次标签前部分开始下标 之间的内容
h3Content = html.substring(lastEndIndex, startIndex);
HtmlRecord htmlRecord = new HtmlRecord();
htmlRecord.setType1(getOnlyHeadContent(h1Name));
htmlRecord.setType2(getOnlyHeadContent(h2Name));
htmlRecord.setKey(getOnlyHeadContent(h3Name));
String dateStr = getDateStrFromHeadStr(h3Name);
htmlRecord.setPublishDt(dateStr);
htmlRecord.setContent(h3Content);
htmlRecord.setPublishDept("合规部门");
records.add(htmlRecord);
}
isH3Tag = false;
if(Objects.equals(tag, "<h1>")){
// 当前为一级标题,重置一级标题名和二级标题名
h1Name = tagContent;
h2Name = "";
}else if(Objects.equals(tag, "<h2>")){
// 当前为二级标题,重置二级标题名
h2Name =tagContent;
}else{
// 当前为三级标题,重置二级标题名
h3Name = tagContent;
isH3Tag = true;
// 获取三级标题后部分结束下标
lastEndIndex = endIndex;
}
}
// 处理最后一个三级标题内容
String tagContent = html.substring(lastEndIndex);
HtmlRecord htmlRecord = new HtmlRecord();
htmlRecord.setType1(getOnlyHeadContent(h1Name));
htmlRecord.setType2(getOnlyHeadContent(h2Name));
htmlRecord.setKey(getOnlyHeadContent(h3Name));
String dateStr = getDateStrFromHeadStr(h3Name);
htmlRecord.setPublishDt(dateStr);
htmlRecord.setContent(tagContent);
records.add(htmlRecord);
htmlRecord.setPublishDept("合规部门");
return records;
}
/**
* 获取标题文本内容
* @param headHtml 标题h5内容
* @return
*/
private static String getOnlyHeadContent(String headHtml){
if(StringUtils.isBlank(headHtml)){
return "";
}
String headContentStr = "";
Pattern pattern = Pattern.compile("<a[^>]*>([^<]*)</a>");
Matcher matcher = pattern.matcher(headHtml);
while(matcher.find()){
String content = matcher.group();
System.out.println(content);
headHtml = headHtml.replace(content,"");
}
headContentStr = headHtml;
return headContentStr;
}
/**
* 从标题中抽取时间信息
* @param headStr 标题内容
* @return
*/
private static String getDateStrFromHeadStr(String headStr){
if(StringUtils.isBlank(headStr)){
return "";
}
String dateStr = "";
Pattern dtPattern = Pattern.compile("20[0-9]{2}年[1-9]{1,2}月[1-9]{1,2}日");
Matcher dtMatcher = dtPattern.matcher(headStr);
if(dtMatcher.find()){
dateStr = dtMatcher.group();
dateStr = dateStr.replace("年","-");
dateStr = dateStr.replace("月","-");
dateStr = dateStr.replace("日","");
System.out.println(dateStr);
}
return dateStr;
}
3、设计不足之处
3.1、 java-mammoth 转换生成html 中表格没有边竖线,这点在项目也有说明
解决方式:不使用pom方式引入jar包; 手动下载项目整合到所需项目中
调整internal/conversion/DocumentToHtml中visit(Table table, Context context)代码,添加border样式即可实现表格的边框效果