在业务系统中,经常会遇到文档内容解析的需求。
例如:
上传 PDF 后提取正文内容;
解析 Word、Excel、PPT 文件内容;
对附件内容做全文检索;
读取用户上传文档中的文本信息;
判断文件类型;
提取文件元数据。
如果每种文件格式都单独引入解析库,代码会比较分散,维护成本也比较高。
这类场景可以使用 Apache Tika。
Apache Tika 是 Apache 开源的文档解析工具,可以识别和提取多种文件类型中的内容和元数据,例如:
PDF
Word
Excel
PPT
HTML
TXT
XML
图片元数据
Tika 提供了多种使用方式:
使用
tika-app命令行工具;独立部署
tika-server,通过 HTTP 接口调用;在 Java 项目中直接引入依赖使用。
本文记录第三种方式:在 Spring Boot 项目中集成 Apache Tika,用于解析文档内容。
一、引入依赖
在 Spring Boot 项目中,先引入 Tika 相关依赖。
推荐通过 tika-bom 统一管理版本。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-bom</artifactId>
<version>2.8.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后引入核心依赖和标准解析器依赖:
<dependencies>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers-standard-package</artifactId>
</dependency>
</dependencies>
其中:
tika-core提供 Tika 的核心能力;tika-parsers-standard-package提供常见文档格式的解析能力;tika-bom用于统一 Tika 相关依赖版本,避免版本冲突。
二、创建 Tika 配置文件
在 resources 目录下创建配置文件:
tika-config.xml
内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<properties>
<encodingDetectors>
<encodingDetector class="org.apache.tika.parser.html.HtmlEncodingDetector">
<params>
<param name="markLimit" type="int">64000</param>
</params>
</encodingDetector>
<encodingDetector class="org.apache.tika.parser.txt.UniversalEncodingDetector">
<params>
<param name="markLimit" type="int">64001</param>
</params>
</encodingDetector>
<encodingDetector class="org.apache.tika.parser.txt.Icu4jEncodingDetector">
<params>
<param name="markLimit" type="int">64002</param>
</params>
</encodingDetector>
</encodingDetectors>
</properties>
这个配置主要用于指定编码检测器。
在解析文本、HTML 等内容时,编码识别会影响最终提取出来的文本内容。
三、创建 Tika 配置类
接下来创建一个 Spring 配置类,把 Tika 注册为 Spring Bean。
import org.apache.tika.Tika;
import org.apache.tika.config.TikaConfig;
import org.apache.tika.detect.Detector;
import org.apache.tika.exception.TikaException;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.Parser;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.io.InputStream;
@Configuration
public class MyTikaConfig {
private final ResourceLoader resourceLoader;
public MyTikaConfig(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
@Bean
public Tika tika() throws TikaException, IOException, SAXException {
Resource resource = resourceLoader.getResource("classpath:tika-config.xml");
try (InputStream inputStream = resource.getInputStream()) {
TikaConfig config = new TikaConfig(inputStream);
Detector detector = config.getDetector();
Parser parser = new AutoDetectParser(config);
return new Tika(detector, parser);
}
}
}
这里做了几件事:
从
classpath加载tika-config.xml;使用配置文件创建
TikaConfig;从
TikaConfig中获取Detector;创建
AutoDetectParser;构造并返回
Tika对象。
AutoDetectParser 会根据文件类型自动选择合适的解析器。
四、在业务代码中使用 Tika
配置完成后,可以在业务类中直接注入 Tika。
示例:
import org.apache.tika.Tika;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@Service
public class DocumentParseService {
private final Tika tika;
public DocumentParseService(Tika tika) {
this.tika = tika;
}
public String parse(MultipartFile file) throws IOException {
return tika.parseToString(file.getInputStream());
}
}
这样就可以从上传文件中提取文本内容。
例如上传一个 PDF、Word 或 TXT 文件,parseToString() 会尝试解析其中的文本并返回字符串。
五、提供一个简单接口
可以写一个简单的 Controller 测试解析效果。
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@RestController
@RequestMapping("/document")
public class DocumentParseController {
private final DocumentParseService documentParseService;
public DocumentParseController(DocumentParseService documentParseService) {
this.documentParseService = documentParseService;
}
@PostMapping("/parse")
public String parse(@RequestParam("file") MultipartFile file) throws IOException {
return documentParseService.parse(file);
}
}
请求方式:
POST /document/parse
表单参数:
file: 上传的文档
接口会返回文档中解析出的文本内容。
六、Tika 常用能力
Tika 类中常用的方法包括:
1. 检测文件类型
String contentType = tika.detect(file.getInputStream());
例如可能返回:
application/pdf
application/vnd.openxmlformats-officedocument.wordprocessingml.document
text/plain
2. 解析文件内容
String content = tika.parseToString(file.getInputStream());
用于提取文档中的文本内容。
3. 从文件对象中解析
String content = tika.parseToString(file);
如果本地已经有 File 对象,也可以直接解析。
七、使用时需要注意的问题
1. 注意文件大小
parseToString() 会把解析结果作为字符串返回。
如果文件很大,解析出来的文本也可能很大,需要注意内存占用。
业务中可以根据情况限制上传文件大小。
2. 注意异常处理
文档解析可能因为文件损坏、格式不支持、内容异常等原因失败。
业务代码中建议捕获异常并返回明确提示。
例如:
try {
return tika.parseToString(file.getInputStream());
} catch (Exception e) {
throw new RuntimeException("文档解析失败", e);
}
3. 注意上传文件校验
不要直接信任上传文件。
解析前可以先校验:
文件是否为空;
文件大小是否超过限制;
文件类型是否允许;
文件名是否合法。
4. 注意解析结果清洗
Tika 提取的是文档文本内容,不一定适合直接展示。
例如可能包含:
多余换行;
空格;
页眉页脚;
表格内容错位;
特殊字符。
如果要用于搜索或展示,建议后续再做清洗处理。
八、适合的使用场景
Apache Tika 比较适合以下场景:
1. 文档全文检索
上传文档后,先用 Tika 提取正文内容,再写入 Elasticsearch 或其他搜索引擎。
2. 附件内容预览
对上传的附件提取文本,提供简单预览能力。
3. 文件类型识别
通过内容检测文件类型,而不是只依赖文件后缀。
4. 文档内容审核
提取文档文本后,做关键词检测、敏感词检测或合规检查。
5. 简单的文档信息抽取
从文档中提取可读文本,用于后续业务处理。
九、完整流程回顾
Spring Boot 集成 Apache Tika 的流程比较简单:
1. 引入 tika-bom 管理版本
2. 引入 tika-core
3. 引入 tika-parsers-standard-package
4. 在 resources 下创建 tika-config.xml
5. 创建 Tika 配置类
6. 将 Tika 注册为 Spring Bean
7. 在业务代码中注入 Tika
8. 调用 parseToString() 解析文档内容
结论
Apache Tika 可以帮助 Java 项目统一处理多种文档格式的内容解析问题。
在 Spring Boot 中集成时,核心步骤是:
引入 Tika 依赖;
创建
tika-config.xml;注册
TikaBean;在业务代码中注入并调用。
对于 PDF、Word、Excel、PPT、TXT 等常见文件内容解析,Tika 可以减少大量重复适配工作。