知识库文档处理,word转markdown

前一篇我讲解了如何对接MiniMax实现FAQ,其实知识库不仅仅可以实现FAQ,还能实现帮助文档的查询,内部培训资料的查询等等,但是这些培训资料大部分是word版本的,并且有层级结构,比如标题1,标题1-1等等,这种层级结构AI是无法识别的,所以需要转换成markdown格式的,帮助文档还有一个问题就是相似问题容易混淆,比如A文档有联系人,B文档也有联系人,这时查联系人就会出现错误的情况,所以要在每个标题前加前缀,比如A文档的联系人,B文档的联系人,这些也希望能够在转换程序中实现.

代码实现

java 复制代码
public class MDTest {

    @Test
    public void testMD() throws Exception {
        String preHeader = "A文档的";
        if (preHeader == null) preHeader = "";
        String path = "d:/333.docx";
        File file = new File(path);
        FileInputStream is = new FileInputStream(file);
        XWPFDocument document = new XWPFDocument(is);
        StringBuilder sb = new StringBuilder();
        for (IBodyElement e : document.getBodyElements()) {
            if (e instanceof XWPFParagraph) {
                XWPFParagraph paragraph = (XWPFParagraph) e;
                appendParagraphText(sb, paragraph, document, preHeader);
            } else if (e instanceof XWPFTable) {
                XWPFTable table = (XWPFTable) e;
                appendTableText(sb, table);
            } else if (e instanceof XWPFSDT) {
                sb.append(((XWPFSDT) e).getContent().getText());
            }
            sb.append('\n');
        }
        FileUtil.writeBytes(sb.toString().getBytes(), "d:/aaa.md");
    }

    private static boolean isHeadTitle(XWPFDocument document, XWPFParagraph paragraph) {
        String styleName = getStyleName(document, paragraph);
        return styleName.toLowerCase().startsWith("heading");
    }

    private static String getStyleName(XWPFDocument document, XWPFParagraph paragraph) {
        String styleId = paragraph.getStyleID();
        if (StringUtils.isNotEmpty(styleId)) {
            XWPFStyle style = document.getStyles().getStyle(styleId);
            return style.getName();
        }
        return "";
    }

    private static void appendTableText(StringBuilder text, XWPFTable table) {
        for (XWPFTableRow row : table.getRows()) {
            List<ICell> cells = row.getTableICells();
            for (int i = 0; i < cells.size(); i++) {
                ICell cell = cells.get(i);
                if (cell instanceof XWPFTableCell) {
                    text.append(((XWPFTableCell) cell).getTextRecursively());
                } else if (cell instanceof XWPFSDTCell) {
                    text.append(((XWPFSDTCell) cell).getContent().getText());
                }
                if (i < cells.size() - 1) {
                    text.append("\t");
                }
            }
            text.append('\n');
        }
    }

    private static void appendParagraphText(StringBuilder text, XWPFParagraph paragraph, XWPFDocument document, String preHeader) {
        String styleName = getStyleName(document, paragraph);
        if (styleName.toLowerCase().startsWith("heading")) {
            String number = styleName.replaceAll(".*(\\d+)$", "$1");
            appendHeader(text, number, preHeader);
        }
        for (IRunElement run : paragraph.getRuns()) {
            text.append(run);
        }
    }

    private static void appendHeader(StringBuilder text, String number, String preHeader) {
        if (StringUtils.isEmpty(number)) return;
        int num = Integer.parseInt(number);
        for (int i = 0; i < num; i++) {
            text.append("#");
        }
        text.append(" ").append(preHeader);
    }
}

代码解析

我们先通过poi读取word文档,然后获取段落,getStyleName方法可以获取段落的样式,如果样式是heading 1,表示是标题1,heading 2是标题2,而markdown格式的标题1是# 标题,标题2是## 标题,这样就能实现转换,其余的直接按照文本放入就行了

效果

word形式

markdown形式

相关推荐
玩泥巴的2 天前
.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)
word·二次开发·office·com互操作
路由侠内网穿透2 天前
本地部署 GPS 跟踪系统 Traccar 并实现外部访问
运维·服务器·网络·windows·tcp/ip
研华嵌入式2 天前
如何在高通跃龙QCS6490 Arm架构上使用Windows 11 IoT企业版?
arm开发·windows·嵌入式硬件
带娃的IT创业者3 天前
Windows 平台上基于 MCP 构建“文心一言+彩云天气”服务实战
人工智能·windows·文心一言·mcp
csdn_aspnet3 天前
Windows Node.js 安装及环境配置详细教程
windows·node.js
摇滚侠3 天前
java语言中,list<String>转成字符串,逗号分割;List<Integer>转字符串,逗号分割
java·windows·list
Source.Liu3 天前
【Pywinauto库】12.2 pywinauto.element_info 后端内部实施模块
windows·python·自动化
Source.Liu3 天前
【Pywinauto库】12.1 pywinauto.backend 后端内部实施模块
开发语言·windows·python·自动化
私人珍藏库3 天前
[Windows] FileOptimizer v17.1.0_一款文件批量压缩工具
windows·批量压缩
掘根3 天前
【CMake】List
windows·microsoft·list