Spring Boot + Apache Tika 从文件或文件流中提取文本内容
应用效果:
1、安装 Apache Tika 依赖
pom.xml
<!-- Apache Tika 从文件中提取结构化文本和元数据 --><dependency><groupId>org.apache.tika</groupId><artifactId>tika-core</artifactId><version>2.9.2</version></dependency><dependency><groupId>org.apache.tika</groupId><artifactId>tika-parsers-standard-package</artifactId><version>2.9.2</version></dependency>
2、前端 Vue3
API:qualityFile.ts
/*** 从文件或文件流中提取文本内容* @param fileNo 文件编号(可能包含非安全字符,如:4.2 2人员v∕V/v+DW=dw,其中空格、全角斜杠∕、半角斜杠/、加号+、非ASCII字符(如中文、日文等),这些字符为非安全字符,在URL中都会被编码传输)* @returns 文本内容*/
export const qualityFileParseService = (fileNo: string) => {return request.get("/resources/qualityFile/parse", {params: {fileNo: fileNo}});
};
UI:QualityFile.vue
// 提取
const onParseClick = async (fileNo: string) => {const result = await qualityFileParseService(fileNo);store.currentParseFileText = result.data;// 显示质量体系文件文本提取内容模态框showContentDialogRef.value?.showDialog();
};<BasePreventReClickButtonclass="table-btn"type="primary"size="default"text:loading="false":disabled="scope.row.isNullContent"@click="onParseClick(scope.row.fileNo)">提取</BasePreventReClickButton>
3、后端 Spring Boot
Controller:QualityFileController.java
/*** 从文件或文件流中提取文本内容** @param fileNo 文件编号(可能包含非安全字符,如:4.2 2人员v∕V/v+DW=dw,其中空格、全角斜杠∕、半角斜杠/、加号+、中文为非安全字符)* @return 文本内容* @apiNote 本接口使用防抖机制,3s 内重复请求会被忽略*/@GetMapping("/parse")@Debounce(key = "/resources/qualityFile/parse", value = 3000)public Result<String> parse(String fileNo) throws TikaException, IOException {log.info("【质量体系文件】,提取文件中的文本内容,/resources/qualityFile/parse,fileNo = {}", fileNo);String fileContentStr = qualityFileService.parse(fileNo);return Result.success(fileContentStr);}
Service:QualityFileService.java
/*** 从文件或文件流中提取文本内容*/String parse(String fileNo) throws TikaException, IOException;
Service 实现:QualityFileServiceImpl.java
/*** 从文件或文件流中提取文本内容*/@Overridepublic String parse(String fileNo) throws TikaException, IOException {// 获取文件数据FileData fileData = qualityFileMapper.selectFileData(fileNo);// 从文件名中获取路径分隔符String pathSplitString = FileUtils.getPathSplitString(fileData.getFileName());// 有路径分隔符,提取本地磁盘中文件的文本内容if (!pathSplitString.isEmpty()) {// 获取文件绝对路径String filePathName = FileUtils.joinDirectoryPath(mainDirectoryPath, fileData.getFileName());// 提取本地磁盘中文件的文本内容return FileUtils.parseFile(new File(filePathName));}// 无路径分隔符,提取数据库中文件流的文本内容else {InputStream fileStream = new ByteArrayInputStream(fileData.getFileContent());// 提取数据库中文件流的文本内容return FileUtils.parseFile(fileStream);}}
文件工具类:FileUtils.java
package com.weiyu.utils;import org.apache.tika.Tika;
import org.apache.tika.exception.TikaException;import java.io.File;
import java.io.IOException;
import java.io.InputStream;/*** 文件工具*/
public class FileUtils {private static final Tika tika = new Tika();/*** 解析文件,提取文件中的文本内容** @param file 文件* @return 文件中的文本内容* @throws IOException IO异常* @throws TikaException Tika异常*/public static String parseFile(File file) throws IOException, TikaException {return tika.parseToString(file);}/*** 解析文件,提取文件流中的文本内容** @param fileStream 文件流* @return 文件中的文本内容* @throws IOException IO异常* @throws TikaException Tika异常*/public static String parseFile(InputStream fileStream) throws IOException, TikaException {return tika.parseToString(fileStream);}
}