01 引言
在日常工作中,你是否曾為這些場景頭疼過?
- 堆積如山的
PDF
、Word
、Excel
文檔,如何快速提取關鍵信息? - 用戶上傳的文件五花八門,如何自動識別類型并安全處理?
- 構建搜索引擎時,如何讓系統“讀懂”各種文件的內容?
Apache Tika
正是為解決這些難題而生!這款強大的內容檢測與提取工具,堪稱企業數據處理流程中的隱形功臣。
我們一起來解鎖一下吧!
02 Apache Tika是什么
Apache Tika
是一個內容分析工具包。工具包可檢測并提取來自一千多種不同文件類型(如 PPT
、XLS
和 PDF
)的元數據和文本。所有這些文件類型都可以通過一個界面進行解析,這使得 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
),識別的效率極低。對于音頻和圖片的部分處理和預期結果不符。