解锁万能文件内容提取器:Apache Tika

01 引言

在日常工作中,你是否曾为这些场景头疼过?

  • 堆积如山的PDFWordExcel文档,如何快速提取关键信息?
  • 用户上传的文件五花八门,如何自动识别类型并安全处理?
  • 构建搜索引擎时,如何让系统“读懂”各种文件的内容?

Apache Tika 正是为解决这些难题而生!这款强大的内容检测与提取工具,堪称企业数据处理流程中的隐形功臣。

我们一起来解锁一下吧!

02 Apache Tika是什么

Apache Tika是一个内容分析工具包。工具包可检测并提取来自一千多种不同文件类型(如 PPTXLSPDF)的元数据和文本。所有这些文件类型都可以通过一个界面进行解析,这使得 Tika 可用于搜索引擎索引、内容分析、翻译等等。其核心价值在于:“让应用程序不再关心文件格式的复杂性”

核心能力

  • 格式检测(MIME Type Detection):准确判断文件类型。
  • 内容提取(Content Extraction):从文件中剥离文本内容。
  • 元数据提取(Metadata Extraction):获取文件的元数据信息。

03 最佳实践

依赖准备:

<dependency><groupId>org.apache.tika</groupId><artifactId>tika-core</artifactId><version>3.2.0</version>
</dependency>
<dependency><groupId>org.apache.tika</groupId><artifactId>tika-parsers-standard-package</artifactId><version>3.2.0</version>
</dependency>

3.1 格式检测

当我们无法判断文件的MIME,用Tika就对了,他会告诉你答案:

@Test
void test01() throws Exception {Tika tika = new Tika();String detect = tika.detect(ResourceUtils.getFile("classpath:file/a.txt"));System.out.println("a.txt的MIME类型:" + detect);String detect2 = tika.detect(ResourceUtils.getFile("classpath:file/collectFile.zip"));System.out.println("collectFile.zip的MIME类型:" + detect2);String detect3 = tika.detect(ResourceUtils.getFile("classpath:file/fp.pdf"));System.out.println("fp.pdf的MIME类型:" + detect3);
}

执行结果

3.2 内容提取

不用关心文件的格式,可以自动提取内容

@Test
void test02() throws Exception {Tika tika = new Tika();String text = tika.parseToString(ResourceUtils.getFile("classpath:file/a.txt"));System.out.println("提取的内容1:\n" + text);String text2 = tika.parseToString(ResourceUtils.getFile("classpath:file/fp.pdf"));System.out.println("提取的内容2:\n" + text2);
}

执行结果

3.3 元数据提取

一个文件的元数据都有啥,我们一起瞅瞅:

@Test
void test04() throws Exception {File file = ResourceUtils.getFile("classpath:file/collectFile.zip");// 方法1:Tika tika = new Tika();Metadata metadata = new Metadata();tika.parse(file, metadata);for (String name : metadata.names()) {System.out.println(name + " → " + metadata.get(name));}System.out.println("-----------------方法分割线--------------");// 方法2:BodyContentHandler handler = new BodyContentHandler();try (FileInputStream stream = new FileInputStream(file)) {new AutoDetectParser().parse(stream, handler, metadata);for (String name : metadata.names()) {System.out.println(name + " → " + metadata.get(name));}}
}

执行结果

3.4 敏感词检测

敏感词的检测用在文本内容检测,而文件无法直接检测,需要借助Tika提取内容完成敏感词的检测等。

@Test
void test05() throws Exception {// 模拟敏感词库List<String> SENSITIVE_WORDS = List.of("机密", "绝密", "禁止外传");File file = ResourceUtils.getFile("classpath:file/a.txt");Tika tika = new Tika();String content = tika.parseToString(file);if (SENSITIVE_WORDS.stream().anyMatch(content::contains)) {System.out.println("包含敏感词");}    
}

此案例的敏感词检测,是通过提取全部内容检测,只能适用于文件内容相对较少的情况下。如果文件内容过多就可能会出现性能问题。

我们需要稍加改造,需要借助的关键类:org.apache.tika.sax.ContentHandlerDecorator,通过流的方式针对文件内容一部分一部分检测。

@Test
void test06() throws Exception {// 模拟敏感词库List<String> SENSITIVE_WORDS = List.of("机密", "绝密", "禁止外传");File file = ResourceUtils.getFile("classpath:file/a.txt");Metadata metadata = new Metadata();ParseContext parseContext = new ParseContext();try (FileInputStream stream = new FileInputStream(file)) {new AutoDetectParser().parse(stream, new ContentHandlerDecorator(){@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {String text = new String(ch, start, length);if (SENSITIVE_WORDS.stream().anyMatch(text::contains)) {System.out.println("包含敏感词");}}}, metadata, parseContext);}
}

04 Spring Boot集成

工具的使用最终还是要应用到项目中,看看怎么集成的。

4.1 Bean配置

// Spring Boot配置类
@Configuration
public class TikaConfig {@Beanpublic Tika tikaInstance() {return new Tika(TikaConfig.getDefaultConfig());}
}

Tika的配置,也可以通过配置文件定义。

org.apache.tika.config.TikaConfig的配置是无法通过Java去赋值的,只能通过外部的配置文件去配置。

如配置文件的名称为:tika-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<properties><parsers><parser class="org.apache.tika.parser.DefaultParser"/><parser class="org.apache.tika.parser.ocr.TesseractOCRParser" /></parsers>
</properties>

加载自定义配置:

TikaConfig config = new TikaConfig(ResourceUtils.getFile("classpath:tika-config.xml"));
// TikaConfig config = new TikaConfig(this.getClass().getResourceAsStream("tika-config.xml"));
Tika tika = new Tika(config);

4.2 文件解析服务

// 文件解析服务
@Service
public class FileTikaService {@Autowiredprivate Tika tika;@Value("${tika.maxFileSize:10485760}") // 默认10MBprivate long maxFileSize;public JsonResult FileTika(MultipartFile file) throws Exception {// 校验文件大小if (file.getSize() > maxFileSize) {throw new IllegalArgumentException("文件超过大小限制");}Metadata metadata = new Metadata();String content = tika.parseToString(file.getInputStream(), metadata);// 其他业务 ......return new JsonResult(true, data); }
}

05 最佳实践建议

5.1 解析策略的选择

5.2 监控关键指标

  • 解析成功率(按文件类型统计)
  • 平均解析时间分布
  • 内存消耗峰值
  • 异常文件类型TOP10

06 小结

Apache Tika + Java 的组合,让复杂文件解析变得异常简单。无论是构建文档管理系统、内容搜索引擎还是安全审查平台,只需几行核心代码即可解锁跨格式数据处理能力。

但是Apache Tika又有自己的局限性,如ocr默认集成的是tess4j(tika-parser-ocr-module),识别的效率极低。对于音频和图片的部分处理和预期结果不符。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87573.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gemini-cli初体验

目录 准备配置环境变量运行使用基础使用配置MCP调用MCP 参考 准备 NodeJS 18版本 配置环境变量 设置GEMINI_API_KEY 变量&#xff0c;在https://aistudio.google.com/apikey创建key 设置代理&#xff08;可选&#xff0c;取决于您的网络&#xff09;,不配置可能会报错 api e…

Java --类变量和类方法--main语句

1. 类变量和类方法 介绍&#xff1a; 类变量也叫静态变量/静态属性&#xff0c;是该类的所有对象共享的变量&#xff0c;任何一个该类的对象去访问它时&#xff0c;取到的都是相同的值&#xff0c;同样任何一个该类的对象去修改它时&#xff0c;修改的也是同一个变量。 语法…

spring boot项目配置使用minion

一. Minio概述 Minio是一款开源的高性能对象存储服务,兼容Amazon S3 API,适用于私有云、混合云及边缘计算场景。它采用分布式架构设计,支持水平扩展,提供数据加密、版本控制、生命周期管理等企业级功能,适用于存储非结构化数据(如图片、视频、日志等)。 核心特性 S3兼…

<5>_Linux进程控制

目录 一&#xff0c;进程创建&#xff0c;fork/vfork 1&#xff0c;fork创建子进程&#xff0c;操作系统都做了什么 2&#xff0c;写时拷贝的做了什么 二&#xff0c;进程终止&#xff0c;echo $&#xff1f; 1&#xff0c;进程终止时&#xff0c;操作系统做了什么 2&…

阿里云服务器正确配置 Docker 国内镜像的方法

&#x1f4e6; 原理说明&#xff1a;什么是“Docker 镜像加速器”&#xff1f; Docker 默认会从官方仓库 registry-1.docker.io 拉取镜像。由于网络原因&#xff0c;在中国大陆访问这个地址较慢甚至失败。 镜像加速器的作用是&#xff1a; 在国内部署一个缓存服务器&#xf…

PH热榜 | 2025-07-05

1. todai 标语&#xff1a;你的第一份个性化快乐生活指数 介绍&#xff1a;Todai 是你个人的人工智能助手&#xff0c;帮助你获得心理清晰和情感平衡。你可以随时随地记录自己的情绪&#xff0c;发现情绪变化的规律&#xff0c;并获取基于科学的工具。 产品网站&#xff1a;…

c++ duiLib环境集成

duiLib的Github链接&#xff1a;https://github.com/duilib/duilib 使用vcpkg快速安装duilib以及配置。步骤如下&#xff1a; 1、用git下载vcpkg&#xff0c;下载报错&#xff0c;这个错误通常表明在Git克隆过程中&#xff0c;与GitHub服务器的SSL连接被意外重置。改用http下…

一项基于粒子图像测速PIV系统的泥石流模拟冲击实验

1实验背景 全国进入“七下八上”防汛关键期&#xff0c;泥石流作为山区常见地质灾害&#xff0c;突发性强&#xff0c;破坏力大&#xff0c;对人民群众生命财产安全造成威胁&#xff0c;传统观测手段难以实现对碎石运动轨迹与水流场耦合效应的精细观测。而粒子图像测速PIV技术…

ADAS功能介绍

ADAS功能介绍 ADAS&#xff08;Advanced Driving Assistance System&#xff09;高级驾驶辅助系统&#xff0c;可分为如下几大类功能。 IA&#xff08;Information Assist&#xff09;信息辅助类 IA类功能&#xff0c;均不包含驾驶行为的控制。这些功能又可以进一步细分为三…

【LUT技术专题】CLUT代码讲解

本文是对CLUT技术的代码讲解&#xff0c;原文解读请看CLUT文章讲解。 1、原文概要 CLUT利用矩阵在保持3DLUT映射能力的前提下显著降低了参数量。整体流程如下所示。 整体还是基于3D-LUT的框架&#xff0c;只不过添加了一个压缩自适应的变换矩阵。作者使用的损失函数在3DLUT的…

在LinuxMint 22.1(Ubuntu24.04)上安装使用同花顺远航版

刚刚在LinuxMint 22.1(Ubuntu24.04)安装完成同花顺远航版&#xff0c;体验特别好&#xff0c;忍不住要及时给深受Linux平台无好用行情软件之苦的朋友们进行分享了。在此之前我一直只能用同花顺Linux原生版的行情软件&#xff0c;但是该软件只有很基本的行情功能&#xff0c;而且…

解决vue3路由配合Transition时跳转导致页面不渲染的问题

问题复现 <router-view v-slot"{ Component, route }"><transition name"fade" mode"out-in"><keep-alive><component :is"Component" :key"route.path" /></keep-alive></transition>…

java: 无法访问org.springframework.boot.SpringApplication,类文件具有错误的版本 61.0, 应为 52.0

问题 java: 无法访问org.springframework.boot.SpringApplication 错误的类文件: /D:/.m2/repository/org/springframework/boot/spring-boot/3.3.13/spring-boot-3.3.13.jar!/org/springframework/boot/SpringApplication.class 类文件具有错误的版本 61.0, 应为 52.0 请删除…

Docker拉取nacos镜像

以下是使用 Docker 拉取并运行 Nacos&#xff08;阿里巴巴开源的配置中心和服务发现组件&#xff09;镜像的详细指南&#xff1a; 1. 拉取 Nacos 官方镜像 拉取最新版 Nacos 镜像&#xff08;推荐指定版本以避免兼容性问题&#xff09;&#xff1a; # 拉取最新版本&#xff…

【CTF-Web环境搭建】kali

Kali虚拟机下载 这里在官网上下载下kali虚拟机Get Kali | Kali Linux 网速比较慢的话打开一下加速器 下载完成后 得到一个压缩包 选择一个合适的地方将这个压缩包解压一下 记住这个文件目录 这里为了后续方便 简历一个叫做Virtual Machines的文件夹 里面就可以放不同的虚拟机…

微服务架构的演进:迈向云原生

微服务架构的演进&#xff1a;迈向云原生ps:最近在学习的时候&#xff0c;发现好多技术方案最终都有云原生的影子&#xff0c;这里浅谈一下云原生的发展趋势随着互联网技术的发展&#xff0c;软件开发模式经历了从单体应用到微服务架构的重大转变。而在今天&#xff0c;微服务架…

服务器如何配置防火墙规则开放/关闭端口?

配置服务器防火墙规则&#xff08;开放/关闭端口&#xff09;是服务器安全管理的基础操作&#xff0c;不同操作系统和防火墙工具的配置方式有所不同。以下是主流系统的详细操作指南&#xff1a;一、Linux系统&#xff08;iptables/firewalld/UFW&#xff09;1. iptables&#x…

基于SpringBoot+Redis实现外呼频次限制功能

针对外呼场景中的号码频次限制需求&#xff08;如每3天只能呼出1000通电话&#xff09;&#xff0c;我可以提供一个基于Spring Boot和Redis的完整解决方案。 方案设计 核心思路 使用Redis的计数器过期时间机制 采用滑动窗口算法实现精确控制 通过Lua脚本保证原子性操作 实…

下一代 2D 图像设计工具「GitHub 热点速览」

长期以来&#xff0c;2D 设计领域似乎已是 Adobe 与 Figma 的天下&#xff0c;层叠的图层、熟悉的工具栏&#xff0c;一切都显得那么顺理成章&#xff0c;却也让不少设计师在创意的边界上感到了些许乏力。当我们以为设计工具的革新只能是小修小补时&#xff0c;开源社区再次扮演…

L58.【LeetCode题解】模拟算法习题集1(Z 字形变换、外观数列)

目录 1.Z 字形变换 方法1: 模拟 代码 提交结果 方法2:优化后的模拟 代码 提交结果 2.外观数列 方法1:模拟 代码 提交结果 方法2:打表 知识回顾 代码 1.Z 字形变换 https://leetcode.cn/problems/zigzag-conversion/ 将一个给定字符串 s 根据给定的行数 numRows &…