拆分word段落并保留H5样式

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样式即可实现表格的边框效果

 

3.2、java-mammoth会将图片直接base64文本,如果word中存在大量图片,直接将转换后的html存入数据库,会造成数据库存储、查询负担; 可以在处理过程中base64图片还原存储至文件服务器

3.3、待处理word的样式存在要求限制,若不满足则无法正常处理

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值