news 2026/6/14 20:20:03

Apache Tika 教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Apache Tika 教程

Apache Tika 是一个内容分析工具包,用于检测和提取文档中的元数据和文本内容。它支持超过1000种文件格式。

1. 核心特性

  • 格式检测:自动识别文件类型(MIME)

  • 内容提取:提取纯文本内容

  • 元数据提取:获取作者、创建日期等信息

  • 语言检测:识别文档语言

2. 快速开始

Maven 依赖

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

基础用法

import org.apache.tika.Tika; import java.io.File; import java.io.InputStream; // 最简单的方式 Tika tika = new Tika(); String text = tika.parseToString(new File("document.pdf")); System.out.println(text);

3. 主要使用方式

方式一:Tika API(推荐新手)

Tika tika = new Tika(); // 文件类型检测 String mimeType = tika.detect(new File("test.pdf")); // 解析文件 String content = tika.parseToString(new File("test.docx")); // 解析流 try (InputStream is = new FileInputStream("test.pptx")) { String content = tika.parseToString(is); }

方式二:Parser API(更精细控制)

import org.apache.tika.parser.AutoDetectParser; import org.apache.tika.metadata.Metadata; import org.apache.tika.sax.BodyContentHandler; AutoDetectParser parser = new AutoDetectParser(); BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); try (InputStream stream = new FileInputStream("document.pdf")) { parser.parse(stream, handler, metadata); // 获取文本 String text = handler.toString(); // 获取元数据 String author = metadata.get("Author"); String date = metadata.get("Creation-Date"); }

方式三:RecursiveParser(递归嵌入文件)

RecursiveParserWrapper wrapper = new RecursiveParserWrapper( new AutoDetectParser() ); try (InputStream stream = new FileInputStream("embedded.doc")) { wrapper.parse(stream, new BodyContentHandler(), new Metadata()); for (RecursiveParserWrapperHandler.MetadataWithContent mwc : wrapper.getMetadataList()) { System.out.println("File: " + mwc.getMetadata().get(Metadata.RESOURCE_NAME_KEY)); System.out.println("Content: " + mwc.getContentHandler().toString()); } }

4. 常见文件格式支持

格式扩展名支持程度
PDF.pdf完整
Word.doc, .docx完整
Excel.xls, .xlsx完整
PowerPoint.ppt, .pptx完整
HTML/XML.html, .xml完整
图片.jpg, .png, .gif文本+元数据
邮件.eml, .msg完整
RTF.rtf完整
TXT.txt完整

5. 配置选项

设置最大字符串长度

// 默认100k字符 BodyContentHandler handler = new BodyContentHandler(500000);

自定义配置

import org.apache.tika.config.TikaConfig; TikaConfig config = new TikaConfig(); Tika tika = new Tika(config); // 或使用自定义配置文件 TikaConfig config = new TikaConfig("my-tika-config.xml");

排除特定解析器

Parsers parsers = new Parsers(); Set<MediaType> excluded = Set.of( MediaType.APPLICATION_ZIP, MediaType.APPLICATION_PDF ); AutoDetectParser parser = new AutoDetectParser( parsers.getParsers(excluded) );

6. 高级功能

语言检测

import org.apache.tika.language.LanguageIdentifier; String text = "This is an English sentence."; LanguageIdentifier identifier = new LanguageIdentifier(text); String language = identifier.getLanguage(); // "en"

提取特定元数据

Metadata metadata = new Metadata(); // 常用元数据字段 metadata.names().forEach(name -> { System.out.println(name + ": " + metadata.get(name)); }); // 标准字段 metadata.get(Metadata.AUTHOR); metadata.get(Metadata.CREATION_DATE); metadata.get(Metadata.TITLE);

嵌入式内容处理

EmbeddedDocumentExtractor extractor = new EmbeddedDocumentExtractor() { @Override public boolean shouldParseEmbedded(Metadata metadata) { return true; } @Override public void parseEmbedded(InputStream stream, ContentHandler handler, Metadata metadata, boolean outputHtml) { // 处理嵌入式文件 } };

7. 命令行工具

Tika 提供了命令行版本:

# 下载 tika-app.jar wget https://archive.apache.org/dist/tika/2.9.1/tika-app-2.9.1.jar # 提取文本 java -jar tika-app-2.9.1.jar --text document.pdf # 检测MIME类型 java -jar tika-app-2.9.1.jar --detect file.pdf # 提取元数据 java -jar tika-app-2.9.1.jar --metadata document.docx # 列出支持的类型 java -jar tika-app-2.9.1.jar --list-supported-types # JSON输出 java -jar tika-app-2.9.1.jar --json document.pdf

8. 性能优化

复用解析器实例

// 正确做法 - 单例 private static final AutoDetectParser PARSER = new AutoDetectParser(); // 错误做法 - 每次新建 // AutoDetectParser parser = new AutoDetectParser(); // 消耗资源

使用ParseContext缓存

ParseContext context = new ParseContext(); context.set(Parser.class, PARSER); // 复用context parser.parse(stream, handler, metadata, context);

配置内存限制

TikaConfig config = TikaConfig.getDefaultConfig(); // 修改配置限制解析时间和内存

9. 常见问题解决

中文乱码

// 确保使用正确的字符编码 BodyContentHandler handler = new BodyContentHandler(-1); // 手动设置编码 String content = new String(text.getBytes("ISO-8859-1"), "UTF-8");

大文件处理

// 使用流式处理,避免全部加载到内存 try (InputStream stream = new FileInputStream("large.pdf")) { // 限制解析内容大小 BodyContentHandler handler = new BodyContentHandler(1024 * 1024); parser.parse(stream, handler, metadata); }

异常处理

import org.apache.tika.exception.TikaException; import org.xml.sax.SAXException; try { String content = tika.parseToString(file); } catch (TikaException e) { // Tika 特定错误(如无法解析) System.err.println("Tika error: " + e.getMessage()); } catch (IOException e) { // 文件读写错误 System.err.println("IO error: " + e.getMessage()); } catch (SAXException e) { // XML 解析错误 System.err.println("SAX error: " + e.getMessage()); }

10. 完整示例:文档索引工具

import org.apache.tika.Tika; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.AutoDetectParser; import org.apache.tika.parser.ParseContext; import org.apache.tika.sax.BodyContentHandler; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class DocumentIndexer { private static final Tika tika = new Tika(); private static final AutoDetectParser parser = new AutoDetectParser(); public static class DocumentInfo { String path; String content; String mimeType; String author; String title; long fileSize; @Override public String toString() { return String.format("File: %s\nType: %s\nAuthor: %s\nTitle: %s\nSize: %d bytes\nContent: %.100s...\n", path, mimeType, author, title, fileSize, content); } } public static DocumentInfo indexDocument(File file) throws Exception { DocumentInfo info = new DocumentInfo(); info.path = file.getAbsolutePath(); info.fileSize = file.length(); info.mimeType = tika.detect(file); Metadata metadata = new Metadata(); BodyContentHandler handler = new BodyContentHandler(1000000); // 1MB限制 try (InputStream stream = new FileInputStream(file)) { parser.parse(stream, handler, metadata, new ParseContext()); info.content = handler.toString(); info.author = metadata.get("Author"); if (info.author == null) info.author = metadata.get("creator"); info.title = metadata.get("Title"); if (info.title == null) info.title = file.getName(); } return info; } public static void main(String[] args) throws Exception { File directory = new File("/path/to/documents"); List<DocumentInfo> documents = new ArrayList<>(); Files.walk(directory.toPath()) .filter(Files::isRegularFile) .limit(100) .forEach(path -> { try { documents.add(indexDocument(path.toFile())); } catch (Exception e) { System.err.println("Failed to index: " + path + " - " + e.getMessage()); } }); // 输出结果 documents.forEach(doc -> System.out.println(doc)); // 全文搜索示例 String searchTerm = "important"; System.out.println("\nSearching for: " + searchTerm); documents.stream() .filter(doc -> doc.content.toLowerCase().contains(searchTerm.toLowerCase())) .forEach(doc -> System.out.println("Found in: " + doc.path)); } }

11. 版本升级说明

从 1.x 到 2.x 的主要变化:

  • Java 11+ 要求

  • API 包名从org.apache.tika.parser保持不变

  • 移除了部分过时 API

  • 性能优化和内存改进

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 20:19:13

英雄联盟智能助手:免费开源游戏效率工具终极指南

英雄联盟智能助手&#xff1a;免费开源游戏效率工具终极指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟中的繁琐操作而烦恼…

作者头像 李华
网站建设 2026/6/14 20:17:00

【 上岸必看!【药学】必背100题及解析(卷号:06121219_03) 】

【 上岸必看&#xff01;【药学】必背100题及解析&#xff08;卷号&#xff1a;06121219_03&#xff09; 】 ■ 试卷元数据 更新日期&#xff1a;2026-06-13 涉及科目&#xff1a;药学、中药学、基础课 题量统计&#xff1a;共 90 道核心考题 ■ 内容摘要 本卷旨在帮助2026年…

作者头像 李华
网站建设 2026/6/14 20:14:23

Android字节码逆向工程架构深度解析与实战应用

Android字节码逆向工程架构深度解析与实战应用 【免费下载链接】dex2jar Tools to work with android .dex and java .class files 项目地址: https://gitcode.com/gh_mirrors/de/dex2jar dex2jar作为Android逆向工程领域的重要工具集&#xff0c;提供了完整的Dalvik字节…

作者头像 李华
网站建设 2026/6/14 20:13:16

Pandas DataFrame行级集合运算:交集并集差集实战

1. 项目概述&#xff1a;用集合思维重写 DataFrame 行级操作逻辑 “Set Operations on Python DataFrames”——这个标题乍看像教科书里的一个章节名&#xff0c;但在我带过二十多个数据分析项目、处理过超 300TB 跨源业务数据的实操经验里&#xff0c;它其实是 解决真实世界脏…

作者头像 李华
网站建设 2026/6/14 20:09:58

8个实战技巧掌握fSpy图像相机匹配工具

8个实战技巧掌握fSpy图像相机匹配工具 【免费下载链接】fSpy A cross platform app for quick and easy still image camera matching 项目地址: https://gitcode.com/gh_mirrors/fs/fSpy fSpy是一款开源跨平台的静态图像相机匹配工具&#xff0c;能够快速从单张照片中提…

作者头像 李华