Spring Boot 集成 Apache Tika 实现文档内容解析

作者:old wang 发布时间: 2025-02-26 阅读量:2 评论数:0

在业务系统中,经常会遇到文档内容解析的需求。

例如:

  • 上传 PDF 后提取正文内容;

  • 解析 Word、Excel、PPT 文件内容;

  • 对附件内容做全文检索;

  • 读取用户上传文档中的文本信息;

  • 判断文件类型;

  • 提取文件元数据。

如果每种文件格式都单独引入解析库,代码会比较分散,维护成本也比较高。

这类场景可以使用 Apache Tika。

Apache Tika 是 Apache 开源的文档解析工具,可以识别和提取多种文件类型中的内容和元数据,例如:

PDF
Word
Excel
PPT
HTML
TXT
XML
图片元数据

Tika 提供了多种使用方式:

  1. 使用 tika-app 命令行工具;

  2. 独立部署 tika-server,通过 HTTP 接口调用;

  3. 在 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);
        }
    }
}

这里做了几件事:

  1. classpath 加载 tika-config.xml

  2. 使用配置文件创建 TikaConfig

  3. TikaConfig 中获取 Detector

  4. 创建 AutoDetectParser

  5. 构造并返回 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 中集成时,核心步骤是:

  1. 引入 Tika 依赖;

  2. 创建 tika-config.xml

  3. 注册 Tika Bean;

  4. 在业务代码中注入并调用。

对于 PDF、Word、Excel、PPT、TXT 等常见文件内容解析,Tika 可以减少大量重复适配工作。

评论