ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Spring Boot集成Apache Tika实现多格式文档提取

Spring Boot集成Apache Tika实现多格式文档提取

在日常开发中,我们经常需要从各种格式的文档中提取文本内容,例如 PDF、Word、Excel、PPT 等。手动解析这些格式不仅繁琐,而且容易出错。Apache Tika是一个开源的文档解析工具库,能够自动检测文档类型并提取文本和元数据,支持多达上千种格式(包括 PDF、DOC、XLS、PPT、HTML 等)。它提供了多种使用方式:图形化界面(tika-app)、独立服务(tika-server)以及嵌入到 Java 项目中。本文将演示如何在 Spring Boot 项目中集成 Tika,快速实现文档解析功能。

1. 引入 Tika 依赖

在 Spring Boot 项目的pom.xml中加入 Tika 的依赖管理及核心包:

<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-bom统一管理版本,tika-core提供核心 API,tika-parsers-standard-package包含常用解析器。

2. 创建 Tika 配置文件(可选)

在src/main/resources目录下创建tika-config.xml,用于自定义编码检测器等行为。以下是一个示例配置,主要调整了不同编码检测器的markLimit参数:

<?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>

如果不提供配置文件,Tika 会使用默认配置,一般情况下也足够。

3. 配置 Tika Bean

创建一个配置类MyTikaConfig,加载配置文件并初始化Tika对象。代码如下:

import java.io.IOException; import java.io.InputStream; 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.beans.factory.annotation.Autowired; 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; @Configuration public class MyTikaConfig { @Autowired private ResourceLoader resourceLoader; @Bean public Tika tika() throws TikaException, IOException, SAXException { // 加载自定义配置文件 Resource resource = resourceLoader.getResource("classpath:tika-config.xml"); InputStream inputStream = resource.getInputStream(); TikaConfig config = new TikaConfig(inputStream); Detector detector = config.getDetector(); Parser autoDetectParser = new AutoDetectParser(config); return new Tika(detector, autoDetectParser); } }

这里我们通过ResourceLoader读取 classpath 下的配置文件,然后用它构造TikaConfig,再创建Detector和Parser,最后生成Tika实例。Tika类封装了常用的 detect、parse 等方法,非常方便。

4. 在项目中使用 Tika 解析文档

配置完成后,你可以在任何 Spring 管理的 Bean 中直接注入Tika对象,然后调用其方法解析文档。例如,创建一个 Service 来处理文件上传和解析:

import org.apache.tika.Tika; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.InputStream; @Service public class DocumentParseService { @Autowired private Tika tika; /** * 解析上传的文件,提取文本内容 */ public String parseFile(MultipartFile file) throws Exception { try (InputStream inputStream = file.getInputStream()) { // 自动检测文档类型并解析为文本 return tika.parseToString(inputStream); } } /** * 仅检测文档类型 */ public String detectFileType(MultipartFile file) throws Exception { try (InputStream inputStream = file.getInputStream()) { return tika.detect(inputStream); } } }
  • parseToString:将文档内容解析为纯文本字符串。

  • detect:检测文档的 MIME 类型。

  • 此外,还可以使用parse方法获取结构化内容(如 XHTML)或元数据。

在 Controller 中,你可以接收上传的文件并调用上述 Service:

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @RestController public class FileParseController { @Autowired private DocumentParseService parseService; @PostMapping("/parse") public String parseFile(@RequestParam("file") MultipartFile file) { try { return parseService.parseFile(file); } catch (Exception e) { e.printStackTrace(); return "解析失败:" + e.getMessage(); } } }

启动 Spring Boot 应用,使用 Postman 或前端上传文件,即可得到解析出的文本内容。

5. 总结

通过以上几步,我们就快速在 Spring Boot 中集成了 Apache Tika,实现了对多种文档格式的解析。Tika 的强大之处在于:

  • 自动识别文档类型,无需关心具体格式。

  • 统一 API,解析 PDF、Office 文档、HTML 等只需一行代码。

  • 可扩展性强,支持自定义解析器、编码检测器等。

无论是实现全文搜索、内容分析,还是文档内容提取,Tika 都是一个非常实用的工具。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进