知识库文档处理,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形式
相关文章:

知识库文档处理,word转markdown
前一篇我讲解了如何对接MiniMax实现FAQ,其实知识库不仅仅可以实现FAQ,还能实现帮助文档的查询,内部培训资料的查询等等,但是这些培训资料大部分是word版本的,并且有层级结构,比如标题1,标题1-1等…...
TF和TF-IDF区别和联系
TF(Term Frequency)和TF-IDF(Term Frequency-Inverse Document Frequency)都是用于文本挖掘和信息检索的统计方法,用于评估一个词在文档或文档集合中的重要性。 一.TF(Term Frequency) 1.定义…...

02线性表 - 链表
这里是只讲干货不讲废话的炽念,这个系列的文章是为了我自己以后复习数据结构而写,所以可能会用一种我自己能够听懂的方式来描述,不会像书本上那么枯燥和无聊,且全系列的代码均是可运行的代码,关键地方会给出注释^_^ 全…...

高性能、安全、低碳绿色的趋势下,锐捷网络发布三擎云办公解决方案 3.0
桌面虚拟化作为云时代的主流和热门技术,已经取得了广泛应用。随着生成式 AI 爆炸式发展,CSDN 看到,人工智能正在引发计算、开发、交互三大范式的全面升级,技术开发或将迎来一次全新的科技变革周期,因此 VDI 云桌面随之…...
python3 shutil排除特定或者模糊匹配文件或目录
import shutil import fnmatchdef ignore_files(dir, files):# 定义要忽略的模式ignore_patterns = [file2.txt, dir2, *复制*.py]ignore_list = []<...

Spire.PDF for .NET【文档操作】演示:如何在 C# 中切换 PDF 层的可见性
我们已经演示了如何使用 Spire.PDF在 C# 中向 PDF 文件添加多个图层以及在 PDF 中删除图层。我们还可以在 Spire.PDF 的帮助下在创建新页面图层时切换 PDF 图层的可见性。在本节中,我们将演示如何在 C# 中切换新 PDF 文档中图层的可见性。 Spire.PDF for .NET 是一…...

新文件覆盖旧文件还能复原吗?八大excel文档修复软件免费
新文件覆盖旧文件还能复原吗?文件操作失误,尤其是新文件意外覆盖旧文件的情况时有发生,面对文件被覆盖的情况,我们不仅需要冷静应对,更需要掌握一系列有效的恢复策略。本文将深入探讨八种免费方法,旨在帮助…...

Android 10.0 Launcher3拖拽图标进入hotseat自适应布局功能实现一
1.前言 在10.0的系统rom定制化开发中,在对于launcher3的一些开发定制中,在对hotseat的一些开发中,需要实现动态hotseat居中 的功能,就是在拖拽图标进入和拖出hotseat,都可以保持hotseat居中的功能,接下来分…...

彻底解决idea的编解码问题
一、打开idea,找到Setting,点击File Encoding编解码设置,将以下标红的三个部分全部设置为UTF-8.同理如果你的项目使用的是GBK或者其他编码格式,那么也设置为统一。 二、点击Java Compiler设置补齐-encoding utf-8参数 三、如果你的项目使用到…...

仅两家!云原生向量数据库 PieCloudVector 全项通过信通院「可信数据库」评测
7月16日,2024 可信数据库发展大会在北京隆重举行。大会以“自主、创新、引领”为主题,近百位数据库领域的专家、学者齐聚一堂,带来高质量的数据库技术洞察与实战经验。 本次可信数据库发展大会中,中国信通院正式公布 2024 年上半年…...

vue使用x6画流程图,简单使用
官网 https://x6.antv.antgroup.com/tutorial/getting-started 安装 npm install antv/x6 --save 使用 <template><div>3333<div id"container" style"width: 800px;height: 800px;"></div></div> </template> <…...

低代码中间件学习体验分享:业务系统的创新引擎
前言 星云低代码平台介绍 星云低代码中间件主要面向企业IT部门、软件实施部门的低代码开发平台,无需学习开发语言/技术框架,可视化开发PC网页/PC项目/小程序/安卓/IOS原生移动应用,低门槛,高效率。针对企业研发部门人员少&#…...

阿里云ACP云计算高级攻城狮通用知识
🔥概述 阿里云云计算高级工程师ACP认证是面向使用阿里云云计算产品的架构、开发、运维类人员的专业技术认证,主要考核考生利用阿里云云计算技术服务体系设计稳定、安全、高性能、易扩展、低成本的企业云计算架构的能力。 前提:在写适用人群…...

log4js node日志插件
最近不是特别忙在用express搭建后台项目,在开发过程中遇到了需要输入日志的问 本来想直接用node自带的console来实现,后来发现console输出的日志达不到自己希望的 日志格式,后来各种百度发现了log4js插件,本文来记录log4js插件使用…...

【MQTT(3)】开发一个客户端,QT-Android安卓手机版本
手机版本更加方便 生成安卓库 参考了这个代码 在编译Mosquitto以支持安卓平台时,主要涉及到使用Android NDK(Native Development Kit)进行交叉编译。环境的准备参考之前的博客【QT开发(17)】2023-QT 5.14.2实现Andr…...

大数据之数据抽取架构演变过程
架构演变之Flink架构的演变过程 一、 起初搭建整个大数据平台是基于CDH这一套资源管理和整合的CM资源管理器搭建的 整个平台包括了: HDFS,YARN,HIVE,zoozie,FLINK,Spark,Zookeeper等组件搭建而成, 刚开始搭建的时候&am…...
[web]-反序列化-绕过__wakeup(转)
BUUCTF-[极客大挑战 2019]PHP1_[极客大挑战 2019]php 1-CSDN博客 <?php include flag.php;error_reporting(0);class Name{private $username nonono;private $password yesyes;public function __construct($username,$password){$this->username $username;$this-…...
B树与B+树的区别
B树和B树都是用于数据库和文件系统的平衡树数据结构,但它们有一些显著的区别: 节点结构: B树:每个节点存储数据和指向子节点的指针。叶子节点也包含数据。 B树:内部节点只存储索引值,不存储实际数据。所有…...

机器人开源调度系统OpenTCS-6最新版本地源码运行
OpenTCS 项目使用 Gradle 而不是 Maven,那么需要使用 Gradle 来导入和构建项目。在 IntelliJ IDEA 中导入和运行使用 Gradle 的项目,可以按照以下步骤进行操作: 克隆 OpenTCS 源码 首先,克隆 OpenTCS 的源码到本地。您可以使用以…...

云监控(华为) | 实训学习day3(10)
实现数据的增删改查 SpringBoot框架模式 向送外卖一样理解 写程序 1、准备食材(java bean) 2、菜谱(pojo接口->预制->sql 语句) 3、service处理 4、controller 派送 5、用户请求->页面 一、Spring Boot实现增加 第一步:食材(表),用户增加,这里还是用户…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...