当前位置: 首页 > news >正文

知识库文档处理,word转markdown

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

代码实现

public class MDTest {@Testpublic 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形式

 

http://www.lryc.cn/news/402388.html

相关文章:

  • TF和TF-IDF区别和联系
  • 02线性表 - 链表
  • 高性能、安全、低碳绿色的趋势下,锐捷网络发布三擎云办公解决方案 3.0
  • python3 shutil排除特定或者模糊匹配文件或目录
  • Spire.PDF for .NET【文档操作】演示:如何在 C# 中切换 PDF 层的可见性
  • 新文件覆盖旧文件还能复原吗?八大excel文档修复软件免费
  • Android 10.0 Launcher3拖拽图标进入hotseat自适应布局功能实现一
  • 彻底解决idea的编解码问题
  • 仅两家!云原生向量数据库 PieCloudVector 全项通过信通院「可信数据库」评测
  • vue使用x6画流程图,简单使用
  • 低代码中间件学习体验分享:业务系统的创新引擎
  • 阿里云ACP云计算高级攻城狮通用知识
  • log4js node日志插件
  • 【MQTT(3)】开发一个客户端,QT-Android安卓手机版本
  • 大数据之数据抽取架构演变过程
  • [web]-反序列化-绕过__wakeup(转)
  • B树与B+树的区别
  • 机器人开源调度系统OpenTCS-6最新版本地源码运行
  • 云监控(华为) | 实训学习day3(10)
  • springMVC前后端请求参数绑定和传递
  • 【iOS】—— 消息传递和消息转发
  • 【Node.js】初识 Node.js
  • AWS backup服务和 RDS snapshot的关系
  • PDF转Word怎么快速转换?格式转换技巧分享
  • 浅谈:网络协议及网络连接
  • websocket-react使用
  • 【总结】nginx源码编译安装报错./configure: error: SSL modules require the OpenSSL library.
  • 昇思25天学习打卡营第15天|两个分类实验
  • 实践:Redis6.0配置文件解读
  • 【Go系列】Go语言的网络服务