Tika工具包-搞定上千种文件解析
hi,我是阿昌
,今天分享学习的是 Apache Tika ;
它可从一千多种不同文件类型(例如ppt、xls、pdf、xmind、cad等)中提取解析出元数据和文本。
如果你有对如上文件类型进行提取分析的需求,不凡试试这个框架。
那这里本次使用java语言进行演示demo。
以下基于演示测试:
- jdk:1.8
- tika:2.9.1
- springboot:2.1.0
一、包依赖
那本身Tika在实际使用情况下不难,只需要引入2个依赖:
分别是tika的核心包和一个tika的标准解析器包;
- 核心包:提供了tika核心api和基本的解析框架
- 标准解析器包:各种文件格式的具体解析器实现,tika社区中还有各种更小众文件的解析实现;
1 2 3 4 5 6 7 8 9 10
| <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-parsers-standard-package</artifactId> <version>2.9.1</version> </dependency>
|
二、tika核心方法
detect:获取文件类型
1 2 3
| public String detect(InputStream stream) throws IOException { return this.detect(stream, new Metadata()); }
|
parseToString:获取文本
1 2 3
| public String parseToString(InputStream stream) throws IOException, TikaException { return this.parseToString(stream, new Metadata()); }
|
三、demo代码
1 2 3 4 5
| @PostMapping("parseFileInfo") public ResponseEntity<?> parseFileInfo(MultipartFile file){ Map<String, Object> pareseMap = tikaService.processFile(file); return ResponseEntity.ok(pareseMap); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
@Service public class TikaServiceImpl implements TikaService { private final Tika tikaClient = new Tika(); public String detectFileType(InputStream inputStream) throws IOException { return tikaClient.detect(inputStream); } public String extractText(InputStream inputStream) throws IOException, TikaException { return tikaClient.parseToString(inputStream); } public Map<String, String> extractMetaData(InputStream inputStream, String fileName) throws IOException, TikaException { Metadata metadata = new Metadata(); metadata.set("resourceName", fileName); tikaClient.parseToString(inputStream, metadata); Map<String, String> metadataMap = new HashMap<>(); for (String name : metadata.names()) { metadataMap.put(name, metadata.get(name)); } return metadataMap; } public Map<String, Object> processFile(MultipartFile file) { Map<String, Object> hashMap = new HashMap<>(); String fileType = detectFileType(file.getInputStream()); hashMap.put("fileType", fileType); String content = extractText(file.getInputStream()); hashMap.put("content", content); Map<String, String> metadata = extractMetaData(file.getInputStream(), file.getOriginalFilename()); hashMap.put("metadata", metadata); return hashMap; } }
|
通过http调用传输不同的文件查看解析效果⬇️
postman调用信息:
![image]()
md文件:
![image]()
xls文件:
![image]()
txt文件:
![image]()
xmind文件:
![image]()
doc文件:
![image]()