解鎖萬能文件內容提取器: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
英文地址,請注明出處:http://en.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 &…