From cb8c11dfdd3019a4d44ba14ea5e05c62470a24c9 Mon Sep 17 00:00:00 2001
From: 55007 <55007@maojian>
Date: Tue, 7 Jan 2025 18:17:57 +0800
Subject: [PATCH] =?UTF-8?q?ppt=E8=A7=A3=E6=9E=90=E5=BA=94=E7=94=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 33 ++++
README.md | 1 +
pom.xml | 138 ++++++++++++++++
.../bfd/crawl/ppthandler/PptHanlerApplication.java | 13 ++
.../com/bfd/crawl/ppthandler/bean/ResponsePo.java | 60 +++++++
.../config/AsyncThreadConfiguration.java | 48 ++++++
.../com/bfd/crawl/ppthandler/config/Constant.java | 27 +++
.../controller/PptHandlerController.java | 46 ++++++
.../bfd/crawl/ppthandler/enums/ResponseCode.java | 32 ++++
.../crawl/ppthandler/service/HandlerService.java | 121 ++++++++++++++
.../bfd/crawl/ppthandler/service/SendService.java | 54 ++++++
.../bfd/crawl/ppthandler/service/StartServcie.java | 63 +++++++
.../com/bfd/crawl/ppthandler/util/CsvUtil.java | 44 +++++
.../com/bfd/crawl/ppthandler/util/DataUtil.java | 60 +++++++
.../com/bfd/crawl/ppthandler/util/ExcelUtils.java | 182 +++++++++++++++++++++
.../bfd/crawl/ppthandler/util/FileDownloader.java | 117 +++++++++++++
.../com/bfd/crawl/ppthandler/util/FileUtil.java | 42 +++++
.../com/bfd/crawl/ppthandler/util/OcrUtil.java | 59 +++++++
.../java/com/bfd/crawl/ppthandler/util/OsUtil.java | 23 +++
.../com/bfd/crawl/ppthandler/util/PptUtil.java | 124 ++++++++++++++
.../com/bfd/crawl/ppthandler/util/QueueUtil.java | 19 +++
.../com/bfd/crawl/ppthandler/util/StringUtil.java | 94 +++++++++++
src/main/resources/application.yml | 47 ++++++
src/main/resources/logback-spring.xml | 36 ++++
24 files changed, 1483 insertions(+)
create mode 100644 .gitignore
create mode 100644 README.md
create mode 100644 pom.xml
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/PptHanlerApplication.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/bean/ResponsePo.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/config/AsyncThreadConfiguration.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/config/Constant.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/controller/PptHandlerController.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/enums/ResponseCode.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/service/HandlerService.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/service/SendService.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/service/StartServcie.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/util/CsvUtil.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/util/DataUtil.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/util/ExcelUtils.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/util/FileDownloader.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/util/FileUtil.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/util/OcrUtil.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/util/OsUtil.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/util/PptUtil.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/util/QueueUtil.java
create mode 100644 src/main/java/com/bfd/crawl/ppthandler/util/StringUtil.java
create mode 100644 src/main/resources/application.yml
create mode 100644 src/main/resources/logback-spring.xml
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..549e00a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..5779331
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+ppt 解析应用
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..84546d9
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,138 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.4.RELEASE
+
+
+ com.bfd.crawl
+ pptHandler
+ 0.0.1-SNAPSHOT
+ pptHandler
+ pptHandler
+
+ 8
+
+
+
+
+
+
+ de.codecentric
+ spring-boot-admin-client
+ 2.2.4
+
+
+ org.apache.commons
+ commons-csv
+ 1.10.0
+
+
+ org.springframework.kafka
+ spring-kafka
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ runtime
+ true
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.apache.pdfbox
+ pdfbox
+ 2.0.28
+
+
+
+ org.apache.poi
+ poi-scratchpad
+ 5.2.0
+
+
+ org.apache.poi
+ poi
+ 5.2.0
+
+
+ org.apache.logging.log4j
+ log4j-api
+
+
+
+
+ org.apache.logging.log4j
+ log4j-api
+ 2.17.1
+
+
+ org.apache.poi
+ poi-ooxml
+ 5.2.0
+
+
+
+ com.alibaba
+ fastjson
+ 2.0.17
+
+
+
+ com.squareup.okhttp3
+ okhttp
+ 3.9.1
+
+
+ com.google.code.gson
+ gson
+ 2.8.8
+
+
+ org.apache.kafka
+ kafka-clients
+ 2.3.1
+
+
+ org.springframework.kafka
+ spring-kafka-test
+ test
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+
+
+
+
diff --git a/src/main/java/com/bfd/crawl/ppthandler/PptHanlerApplication.java b/src/main/java/com/bfd/crawl/ppthandler/PptHanlerApplication.java
new file mode 100644
index 0000000..7780d61
--- /dev/null
+++ b/src/main/java/com/bfd/crawl/ppthandler/PptHanlerApplication.java
@@ -0,0 +1,13 @@
+package com.bfd.crawl.ppthandler;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class PptHanlerApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(PptHanlerApplication.class, args);
+ }
+
+}
diff --git a/src/main/java/com/bfd/crawl/ppthandler/bean/ResponsePo.java b/src/main/java/com/bfd/crawl/ppthandler/bean/ResponsePo.java
new file mode 100644
index 0000000..b404c98
--- /dev/null
+++ b/src/main/java/com/bfd/crawl/ppthandler/bean/ResponsePo.java
@@ -0,0 +1,60 @@
+package com.bfd.crawl.ppthandler.bean;
+
+
+
+import com.bfd.crawl.ppthandler.enums.ResponseCode;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author:jinming
+ * @className:ResponsePo
+ * @version:1.0
+ * @description:
+ * @Date:2023/4/3 17:23
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ResponsePo {
+ /**
+ * 响应码
+ */
+ private int code;
+
+ /**
+ * 正常放 返回数据 的JSON串
+ */
+ private Object data;
+
+ /**
+ * 提示消息
+ */
+ private String message;
+
+ public static ResponsePo success() {
+ return setStatus(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.getMessage());
+ }
+
+ public static ResponsePo error() {
+ return setStatus(ResponseCode.FAILURE.getCode(), ResponseCode.FAILURE.getMessage());
+ }
+
+ public static ResponsePo setStatus(int code, String message) {
+ ResponsePo resultBean = new ResponsePo();
+ resultBean.code = code;
+ resultBean.message = message;
+ return resultBean;
+ }
+ public ResponsePo(int code, String message) {
+ this.code = code;
+ this.message = message;
+ this.data = data;
+ }
+ public ResponsePo(ResponseCode responseCode){
+ this.code = responseCode.getCode();
+ this.message = responseCode.getMessage();
+ this.data = data;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/bfd/crawl/ppthandler/config/AsyncThreadConfiguration.java b/src/main/java/com/bfd/crawl/ppthandler/config/AsyncThreadConfiguration.java
new file mode 100644
index 0000000..6c2b134
--- /dev/null
+++ b/src/main/java/com/bfd/crawl/ppthandler/config/AsyncThreadConfiguration.java
@@ -0,0 +1,48 @@
+package com.bfd.crawl.ppthandler.config;
+
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+
+/**
+ * @author jinming
+ * @version 1.0
+ * @className AsyncThreadConfiguration
+ * @Date 2022/2/17 18:37
+ */
+@Configuration
+@EnableAsync
+public class AsyncThreadConfiguration {
+ @Bean
+ public Executor asyncExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ // 核心线程数
+ executor.setCorePoolSize(500);
+ // 并发线程的数量限制为2
+ executor.setMaxPoolSize(500);
+ // 线程队列
+ executor.setQueueCapacity(500);
+ executor.setThreadNamePrefix("handlerData-");
+ executor.initialize();
+ executor.setWaitForTasksToCompleteOnShutdown(true);
+ return executor;
+ }
+ @Bean
+ public Executor sendExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ // 核心线程数
+ executor.setCorePoolSize(500);
+ // 并发线程的数量限制为2
+ executor.setMaxPoolSize(500);
+ // 线程队列
+ executor.setQueueCapacity(500);
+ executor.setThreadNamePrefix("sendData-");
+ executor.initialize();
+ executor.setWaitForTasksToCompleteOnShutdown(true);
+ return executor;
+ }
+}
diff --git a/src/main/java/com/bfd/crawl/ppthandler/config/Constant.java b/src/main/java/com/bfd/crawl/ppthandler/config/Constant.java
new file mode 100644
index 0000000..8d6acfc
--- /dev/null
+++ b/src/main/java/com/bfd/crawl/ppthandler/config/Constant.java
@@ -0,0 +1,27 @@
+package com.bfd.crawl.ppthandler.config;
+
+/**
+ * @author:jinming
+ * @className:Constant
+ * @version:1.0
+ * @description:
+ * @Date:2023/8/16 15:26
+ */
+public class Constant {
+ /**
+ *
+ */
+ public final static String IS_XLS = "xls";
+
+ /**
+ *
+ */
+ public final static String IS_CSV = "csv";
+
+ /**
+ *
+ */
+ public final static String ALL = "*";
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/bfd/crawl/ppthandler/controller/PptHandlerController.java b/src/main/java/com/bfd/crawl/ppthandler/controller/PptHandlerController.java
new file mode 100644
index 0000000..4efac6b
--- /dev/null
+++ b/src/main/java/com/bfd/crawl/ppthandler/controller/PptHandlerController.java
@@ -0,0 +1,46 @@
+package com.bfd.crawl.ppthandler.controller;
+
+
+import com.alibaba.fastjson.JSON;
+
+import com.bfd.crawl.ppthandler.bean.ResponsePo;
+import com.bfd.crawl.ppthandler.enums.ResponseCode;
+import com.bfd.crawl.ppthandler.util.QueueUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * @author:jinming
+ * @className:DataFilterController
+ * @version:1.0
+ * @description:
+ * @Date:2023/7/26 11:21
+ */
+@RestController
+@RequestMapping("/handlerdata")
+@Slf4j
+public class PptHandlerController {
+ @PostMapping("/ppthandler")
+ public ResponsePo documentFeedback(@RequestBody String dataJson) {
+
+ ResponsePo responsePo = ResponsePo.success();
+ try {
+ Map parse = (Map) JSON.parse(dataJson);
+ } catch (Exception e) {
+ e.printStackTrace();
+ log.error("请求格式发生异常" + e.getMessage());
+ responsePo.setCode(ResponseCode.FAILURE.getCode());
+ responsePo.setMessage(ResponseCode.FAILURE.getMessage());
+ return responsePo;
+ }
+ log.info("新增任务:" + dataJson);
+ QueueUtil.taskQueue.add(dataJson);
+
+ return responsePo;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/bfd/crawl/ppthandler/enums/ResponseCode.java b/src/main/java/com/bfd/crawl/ppthandler/enums/ResponseCode.java
new file mode 100644
index 0000000..e8c5a44
--- /dev/null
+++ b/src/main/java/com/bfd/crawl/ppthandler/enums/ResponseCode.java
@@ -0,0 +1,32 @@
+package com.bfd.crawl.ppthandler.enums;
+
+/**
+ * @author:jinming
+ * @className:ResponseCodeEnum
+ * @version:1.0
+ * @description:响应结果码枚举类
+ * @Date:2023/2/28 11:40
+ */
+public enum ResponseCode {
+ //返回结果码枚举类
+ SUCCESS(200, "操作成功"),
+ FAILURE(400, "参数错误"),
+ INTERNAL_SERVER_ERROR(500, "服务器内部错误"),
+ TYPE_NOT_SUPPORT(601,"文件类型不支持");
+
+ private int code;
+ private String message;
+
+ ResponseCode(int code, String message) {
+ this.code = code;
+ this.message = message;
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/bfd/crawl/ppthandler/service/HandlerService.java b/src/main/java/com/bfd/crawl/ppthandler/service/HandlerService.java
new file mode 100644
index 0000000..1715702
--- /dev/null
+++ b/src/main/java/com/bfd/crawl/ppthandler/service/HandlerService.java
@@ -0,0 +1,121 @@
+package com.bfd.crawl.ppthandler.service;
+
+
+import com.alibaba.fastjson.JSON;
+import com.bfd.crawl.ppthandler.config.Constant;
+import com.bfd.crawl.ppthandler.util.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author:jinming
+ * @className:HandlerService
+ * @version:1.0
+ * @description:
+ * @Date:2023/8/1 16:05
+ */
+@Service
+@Slf4j
+public class HandlerService {
+ @Value("${file.path}")
+ private String downloadFilePath;
+
+ @Async("asyncExecutor")
+ void run() {
+ while (true) {
+ try {
+ if (QueueUtil.taskQueue.size() > 0) {
+ String dataJson = null;
+ try {
+ dataJson = QueueUtil.taskQueue.take();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ continue;
+ }
+ String errorMessage = "";
+ Map parse = (Map) JSON.parse(dataJson);
+ Map dataMap = (Map) parse.get("data");
+ int id = (int) parse.get("id");
+ Map admin = (Map) parse.get("input");
+
+ String key = (String) admin.get("fileUrl");
+ String fileUrl = (String) DataUtil.getValue(key, dataMap);
+ boolean windows = OsUtil.isWindows();
+ Map output = (Map) parse.get("output");
+// List sheetName = (List) admin.get("sheetName");
+ //fieldType:自定义输出字段: 0 关闭,1-开启,如果开启则拼接form到output里(如果关闭,则取默认的output拼接)
+ String fileType = StringUtil.getStrByPattern(fileUrl, "\\.[^.\\\\/:*?\"<>|\\r\\n]+$");
+ log.info("任务:" + id + "的文件类型为" + fileType);
+ String fileName = StringUtil.getMd5(fileUrl);
+ //定义ppt的下载路径
+ String pptDir = null;
+ try {
+ pptDir = downloadFilePath.concat(windows ? "\\ppt\\" : "/ppt/").concat(fileName).concat(fileType);
+ FileDownloader.downloadFile(fileUrl, new File(pptDir));
+ } catch (IOException e) {
+ e.printStackTrace();
+ errorMessage = "文件下载失败";
+ }
+ String pptParse = null;
+ String pptx = "pptx";
+ try {
+ if (fileType.contains(pptx)) {
+ pptParse = PptUtil.parsepptx(pptDir);
+ } else {
+ pptParse = PptUtil.parsePpt(pptDir);
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ errorMessage = "文件解析失败";
+ }
+
+ if (!StringUtil.hasValue(errorMessage)) {
+ Map result = new HashMap(32);
+ Map resultsMap = new HashMap(32);
+ resultsMap.put("result", pptParse);
+ resultsMap.put("isLast", 1);
+ result.put("status", 1);
+ result.put("message", "成功");
+ result.put("results", JSON.toJSONString(resultsMap));
+ parse.put("result", result);
+ String message = JSON.toJSONString(parse);
+ QueueUtil.sendQueue.put(message);
+ continue;
+ }
+ Map result = new HashMap(32);
+ Map resultsMap = new HashMap(32);
+ resultsMap.put("content", errorMessage);
+ resultsMap.put("isLast", 1);
+ result.put("results", JSON.toJSONString(resultsMap));
+ result.put("status", 2);
+ result.put("message", errorMessage);
+ parse.put("result", result);
+ String message = JSON.toJSONString(parse);
+ QueueUtil.sendQueue.put(message);
+ } else {
+ log.info("任务队列为空,休眠3秒");
+ try {
+ Thread.sleep(3000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ log.error("工作线程发生异常" + e.getMessage());
+ }
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/bfd/crawl/ppthandler/service/SendService.java b/src/main/java/com/bfd/crawl/ppthandler/service/SendService.java
new file mode 100644
index 0000000..75d8d1b
--- /dev/null
+++ b/src/main/java/com/bfd/crawl/ppthandler/service/SendService.java
@@ -0,0 +1,54 @@
+package com.bfd.crawl.ppthandler.service;
+
+
+import com.alibaba.fastjson.JSON;
+import com.bfd.crawl.ppthandler.util.QueueUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.kafka.core.KafkaTemplate;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * @author:jinming
+ * @className:SendService
+ * @version:1.0
+ * @description:
+ * @Date:2023/7/31 17:53
+ */
+@Slf4j
+@Service
+public class SendService {
+ @Value("${send.topic}")
+ private String topic;
+
+ @Resource
+ private KafkaTemplate kafkaTemplate;
+
+ @Async("sendExecutor")
+ void sendToKafka() {
+ while (true) {
+ if (QueueUtil.sendQueue.size() > 0) {
+ try {
+ String message = QueueUtil.sendQueue.take();
+ Map parse = (Map) JSON.parse(message);
+ String id = parse.get("id").toString();
+ log.info("ID:" + id + "\t" + "数据已发出");
+ kafkaTemplate.send(topic, message);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } else {
+ log.info("任务队列为空,休眠3秒");
+ try {
+ Thread.sleep(3000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/bfd/crawl/ppthandler/service/StartServcie.java b/src/main/java/com/bfd/crawl/ppthandler/service/StartServcie.java
new file mode 100644
index 0000000..84dea03
--- /dev/null
+++ b/src/main/java/com/bfd/crawl/ppthandler/service/StartServcie.java
@@ -0,0 +1,63 @@
+package com.bfd.crawl.ppthandler.service;
+
+
+import com.bfd.crawl.ppthandler.util.QueueUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author:jinming
+ * @className:StartServcie
+ * @version:1.0
+ * @description:
+ * @Date:2023/7/31 17:14
+ */
+@Service
+@Slf4j
+public class StartServcie implements ApplicationRunner {
+ @Value("${thread.handler}")
+ private int handlerNumber;
+ @Value("${thread.send}")
+ private int sendNumber;
+
+ @Autowired
+ private HandlerService handlerService;
+ @Autowired
+ private SendService sendService;
+
+ @Override
+ public void run(ApplicationArguments args) throws Exception {
+ for (int i = 0; i < handlerNumber; i++) {
+ log.info("处理服务线程" + i + "已启动 ");
+ handlerService.run();
+ }
+ for (int i = 0; i < sendNumber; i++) {
+ log.info("发送服务线程" + i + "已启动 ");
+ sendService.sendToKafka();
+ }
+ Runnable myRunnable = new Runnable() {
+ @Override
+ public void run() {
+ while (true) {
+ log.info("任务队列长度为" + QueueUtil.taskQueue.size());
+ log.info("发送队列长度为" + QueueUtil.sendQueue.size());
+ try {
+ Thread.sleep(10000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ };
+ // 创建一个新的线程,并将Runnable对象传递给Thread构造函数
+ Thread myThread = new Thread(myRunnable);
+ // 启动线程
+ myThread.start();
+
+
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/bfd/crawl/ppthandler/util/CsvUtil.java b/src/main/java/com/bfd/crawl/ppthandler/util/CsvUtil.java
new file mode 100644
index 0000000..a979f34
--- /dev/null
+++ b/src/main/java/com/bfd/crawl/ppthandler/util/CsvUtil.java
@@ -0,0 +1,44 @@
+package com.bfd.crawl.ppthandler.util;
+
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVParser;
+import org.apache.commons.csv.CSVRecord;
+
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author:jinming
+ * @className:CsvUtil
+ * @version:1.0
+ * @description:
+ * @Date:2024/3/25 11:02
+ */
+public class CsvUtil {
+ public static List