- TIKA 教程
- TIKA - 首页
- TIKA - 概述
- TIKA - 架构
- TIKA - 环境
- TIKA - 参考 API
- TIKA - 文件格式
- TIKA - 文档类型检测
- TIKA - 内容提取
- TIKA - 元数据提取
- TIKA - 语言检测
- TIKA - 图形用户界面 (GUI)
- TIKA 有用资源
- TIKA 快速指南
- TIKA - 有用资源
- TIKA - 讨论
TIKA 快速指南
TIKA - 概述
什么是 Apache Tika?
Apache Tika 是一个用于检测文档类型和从各种文件格式中提取内容的库。
在内部,Tika 使用各种现有的文档解析器和文档类型检测技术来检测和提取数据。
使用 Tika,可以开发一个通用的类型检测器和内容提取器,以从不同类型的文档(如电子表格、文本文档、图像、PDF 甚至多媒体输入格式)中提取结构化文本和元数据。
Tika 为解析不同的文件格式提供了一个单一的通用 API。它为每种文档类型使用现有的专用解析器库。
所有这些解析器库都被封装在一个名为 **Parser 接口** 的单一接口下。
为什么选择 Tika?
根据 filext.com 的数据,大约有 1.5 万到 5.1 万种内容类型,而且这个数字还在日益增长。数据以各种格式存储,例如文本文档、Excel 电子表格、PDF、图像和多媒体文件等等。因此,搜索引擎和内容管理系统等应用程序需要额外的支持才能轻松地从这些文档类型中提取数据。Apache Tika 通过提供一个通用的 API 来定位和提取来自多种文件格式的数据来满足这一需求。
Apache Tika 应用
许多应用程序都使用了 Apache Tika。这里我们将讨论一些严重依赖 Apache Tika 的重要应用程序。
搜索引擎
在开发搜索引擎时,Tika 被广泛用于索引数字文档的文本内容。
搜索引擎是信息处理系统,旨在从 Web 搜索信息和已索引的文档。
爬虫是搜索引擎的一个重要组成部分,它爬取 Web 以获取要使用某种索引技术进行索引的文档。之后,爬虫将这些已索引的文档传输到提取组件。
提取组件的职责是从文档中提取文本和元数据。这种提取的内容和元数据对于搜索引擎非常有用。此提取组件包含 Tika。
然后将提取的内容传递给搜索引擎的索引器,后者使用它来构建搜索索引。除此之外,搜索引擎还以多种其他方式使用提取的内容。
文档分析
在人工智能领域,有一些工具可以自动在语义级别分析文档并从中提取各种数据。
在这些应用程序中,文档根据文档提取内容中的主要术语进行分类。
这些工具使用 Tika 进行内容提取来分析从纯文本到数字文档的各种文档。
数字资产管理
一些组织使用称为数字资产管理 (DAM) 的特殊应用程序来管理其数字资产,例如照片、电子书、图纸、音乐和视频。
此类应用程序借助文档类型检测器和元数据提取器对各种文档进行分类。
内容分析
像亚马逊这样的网站会根据用户的兴趣向他们推荐网站上新发布的内容。为此,这些网站遵循 **机器学习技术**,或借助 Facebook 等社交媒体网站提取所需信息,例如用户的喜好和兴趣。收集到的信息将采用 html 标签或其他需要进一步内容类型检测和提取的格式。
对于文档的内容分析,我们拥有实现机器学习技术的技术,例如 **UIMA** 和 **Mahout**。这些技术可用于对文档中的数据进行聚类和分析。
**Apache Mahout** 是一个框架,它在 Apache Hadoop(一个云计算平台)上提供 ML 算法。Mahout 通过遵循某些聚类和过滤技术来提供架构。通过遵循此架构,程序员可以编写自己的 ML 算法,通过采用各种文本和元数据组合来生成推荐。为了向这些算法提供输入,Mahout 的最新版本使用 Tika 从二进制内容中提取文本和元数据。
**Apache UIMA** 分析和处理各种编程语言并生成 UIMA 注释。它在内部使用 Tika Annotator 来提取文档文本和元数据。
历史
年份 | 开发 |
---|---|
2006 | Tika 的理念是在 Lucene 项目管理委员会之前提出的。 |
2006 | 讨论了 Tika 的概念及其在 Jackrabbit 项目中的实用性。 |
2007 | Tika 进入 Apache 孵化器。 |
2008 | 发布了 0.1 版和 0.2 版,Tika 从孵化器毕业到 Lucene 子项目。 |
2009 | 发布了 0.3 版、0.4 版和 0.5 版。 |
2010 | 发布了 0.6 版和 0.7 版,Tika 毕业成为顶级 Apache 项目。 |
2011 | 发布了 Tika 1.0,同年还发布了关于 Tika 的书籍“Tika in Action”。 |
TIKA - 架构
Tika 的应用程序级架构
应用程序程序员可以轻松地将其应用程序集成到 Tika 中。Tika 提供命令行界面和 GUI 以使其更易于使用。
本章将讨论构成 Tika 架构的四个重要模块。下图显示了 Tika 的架构及其四个模块:
- 语言检测机制。
- MIME 检测机制。
- 解析器接口。
- Tika Facade 类。
语言检测机制
每当将文本文档传递给 Tika 时,它都会检测文档的书写语言。它接受没有语言注释的文档,并通过检测语言在文档的元数据中添加该信息。
为了支持语言识别,Tika 在包 **org.apache.tika.language** 中有一个名为 **Language Identifier** 的类,以及一个内部包含用于从给定文本检测语言的算法的语言识别存储库。Tika 在内部使用 N-gram 算法进行语言检测。
MIME 检测机制
Tika 可以根据 MIME 标准检测文档类型。Tika 中的默认 MIME 类型检测是使用 org.apache.tika.mime.mimeTypes 完成的。它对大多数内容类型检测使用 org.apache.tika.detect.Detector 接口。
在内部,Tika 使用多种技术,例如文件通配符、内容类型提示、魔术字节、字符编码以及其他多种技术。
解析器接口
org.apache.tika.parser 的解析器接口是 Tika 中解析文档的关键接口。此接口从文档中提取文本和元数据,并将其总结给希望编写解析器插件的外部用户。
使用针对各个文档类型而不同的具体解析器类,Tika 支持许多文档格式。这些特定于格式的类通过直接实现解析器逻辑或使用外部解析器库来提供对不同文档格式的支持。
Tika Facade 类
使用 Tika Facade 类是从 Java 调用 Tika 的最简单直接的方法,它遵循外观设计模式。您可以在 Tika API 的 org.apache.tika 包中找到 Tika Facade 类。
通过实现基本用例,Tika 充当景观的代理。它抽象了 Tika 库的底层复杂性,例如 MIME 检测机制、解析器接口和语言检测机制,并为用户提供了一个简单的界面来使用。
Tika 的特性
**统一的解析器接口** - Tika 将所有第三方解析器库封装在一个单一的解析器接口中。由于此功能,用户无需选择合适的解析器库并根据遇到的文件类型使用它。
**低内存使用率** - Tika 消耗的内存资源较少,因此易于嵌入 Java 应用程序。我们也可以在资源较少的平台(如移动 PDA)上运行的应用程序中使用 Tika。
**快速处理** - 可以预期应用程序快速进行内容检测和提取。
**灵活的元数据** - Tika 理解用于描述文件的各种元数据模型。
**解析器集成** - Tika 可以在单个应用程序中使用针对每种文档类型而可用的各种解析器库。
**MIME 类型检测** - Tika 可以检测并提取 MIME 标准中包含的所有媒体类型的内容。
**语言检测** - Tika 包含语言识别功能,因此可在多语言网站中根据语言类型使用文档。
Tika 的功能
Tika 支持各种功能:
- 文档类型检测
- 内容提取
- 元数据提取
- 语言检测
文档类型检测
Tika 使用各种检测技术来检测给定文档的类型。
内容提取
Tika 有一个解析器库,可以解析各种文档格式的内容并提取它们。在检测到文档类型后,它会从解析器存储库中选择合适的解析器并传递文档。Tika 的不同类具有解析不同文档格式的方法。
元数据提取
与内容一起,Tika 使用与内容提取相同的过程提取文档的元数据。对于某些文档类型,Tika 有类可以提取元数据。
语言检测
在内部,Tika 使用诸如n-gram之类的算法来检测给定文档中内容的语言。Tika 依赖于诸如Languageidentifier和Profiler之类的类来进行语言识别。
TIKA - 环境
本章将指导您完成在 Windows 和 Linux 上设置 Apache Tika 的过程。安装 Apache Tika 需要用户管理。
系统要求
JDK | Java SE 2 JDK 1.6 或更高版本 |
内存 | 1 GB RAM(推荐) |
磁盘空间 | 无最低要求 |
操作系统版本 | Windows XP 或更高版本,Linux |
步骤 1:验证 Java 安装
要验证 Java 安装,请打开控制台并执行以下java命令。
操作系统 | 任务 | 命令 |
---|---|---|
Windows | 打开命令控制台 | \>java –version |
Linux | 打开命令终端 | $java –version |
如果 Java 已在您的系统上正确安装,则您应该获得以下输出之一,具体取决于您正在使用的平台。
操作系统 | 输出 |
---|---|
Windows | Java 版本 "1.7.0_60"
Java(TM) SE 运行时环境 (build 1.7.0_60-b19) Java Hotspot(TM) 64 位服务器 VM (build 24.60-b09, mixed mode) |
Linux | java 版本 "1.7.0_25" Open JDK 运行时环境 (rhel-2.3.10.4.el6_4-x86_64) Open JDK 64 位服务器 VM (build 23.7-b01, mixed mode) |
在继续本教程之前,我们假设本教程的读者已在其系统上安装了 Java 1.7.0_60。
如果您没有 Java SDK,请从https://www.oracle.com/technetwork/java/javase/downloads/index.html 下载并安装其最新版本。
步骤 2:设置 Java 环境
设置 JAVA_HOME 环境变量以指向 Java 安装在您计算机上的基本目录位置。例如:
操作系统 | 输出 |
---|---|
Windows | 将环境变量 JAVA_HOME 设置为 C:\ProgramFiles\java\jdk1.7.0_60 |
Linux | export JAVA_HOME=/usr/local/java-current |
将 Java 编译器位置的完整路径添加到系统路径。
操作系统 | 输出 |
---|---|
Windows | 将字符串 ;C:\Program Files\Java\jdk1.7.0_60\bin 附加到系统变量 PATH 的末尾。 |
Linux | export PATH=$PATH:$JAVA_HOME/bin/ |
如上所述,从命令提示符验证命令 java -version。
步骤 3:设置 Apache Tika 环境
程序员可以通过使用以下方式将其环境集成到 Apache Tika 中:
- 命令行、
- Tika API、
- Tika 的命令行界面 (CLI)、
- Tika 的图形用户界面 (GUI) 或
- 源代码。
对于任何这些方法,首先,您必须下载 Tika 的源代码。
您可以在https://Tika.apache.org/download.html找到 Tika 的源代码,您将找到两个链接:
apache-tika-1.6-src.zip - 它包含 Tika 的源代码,以及
tika-app-1.6.jar - 它是一个包含 Tika 应用程序的 jar 文件。
下载这两个文件。下面显示了 Tika 官方网站的快照。
下载文件后,设置 jar 文件tika-app-1.6.jar的类路径。添加 jar 文件的完整路径,如下表所示。
操作系统 | 输出 |
---|---|
Windows | 将字符串“C:\jars\tika-app-1.6.jar”附加到用户环境变量 CLASSPATH |
Linux | export CLASSPATH=$CLASSPATH: /usr/share/jars/tika-app-1.6.jar |
Apache 提供了 Tika 应用程序,这是一个使用 Eclipse 的图形用户界面 (GUI) 应用程序。
使用 Eclipse 的 Tika-Maven 构建
打开 Eclipse 并创建一个新项目。
如果您在 Eclipse 中没有 Maven,请按照以下步骤进行设置。
打开链接 https://wiki.eclipse.org/M2E_updatesite_and_gittags。在那里,您将以表格格式找到 m2e 插件版本。
选择最新版本并将 url 的路径保存在 p2 url 列中。
现在重新访问 Eclipse,在菜单栏中,单击帮助,然后从下拉菜单中选择安装新软件
单击添加按钮,键入任何所需的名称(可选)。现在将保存的 url 粘贴到位置字段中。
将添加一个新的插件,其名称是您在上一步中选择的名称,选中其前面的复选框,然后单击下一步。
继续安装。完成后,重新启动 Eclipse。
现在右键单击项目,在配置选项中,选择转换为 Maven 项目。
将出现一个用于创建新 pom 的新向导。将 Group Id 输入为 org.apache.tika,输入 Tika 的最新版本,将打包选择为 jar,然后单击完成。
Maven 项目已成功安装,并且您的项目已转换为 Maven。现在您必须配置 pom.xml 文件。
配置 XML 文件
从https://mvnrepository.com/artifact/org.apache.tika 获取 Tika maven 依赖项
以下是 Apache Tika 的完整 Maven 依赖项。
<dependency> <groupId>org.apache.Tika</groupId> <artifactId>Tika-core</artifactId> <version>1.6</version> <groupId>org.apache.Tika</groupId> <artifactId> Tika-parsers</artifactId> <version> 1.6</version> <groupId> org.apache.Tika</groupId> <artifactId>Tika</artifactId> <version>1.6</version> <groupId>org.apache.Tika</groupId> < artifactId>Tika-serialization</artifactId> < version>1.6< /version> < groupId>org.apache.Tika< /groupId> < artifactId>Tika-app< /artifactId> < version>1.6< /version> <groupId>org.apache.Tika</groupId> <artifactId>Tika-bundle</artifactId> <version>1.6</version> </dependency>
TIKA - 参考 API
用户可以使用 Tika facade 类将其嵌入到他们的应用程序中。它具有探索 Tika 所有功能的方法。因为它是一个 facade 类,所以 Tika 隐藏了其功能背后的复杂性。除此之外,用户还可以使用 Tika 的各种类在其应用程序中。
Tika 类 (facade)
这是 Tika 库中最突出的类,遵循 facade 设计模式。因此,它隐藏了所有内部实现,并提供简单的访问 Tika 功能的方法。下表列出了此类的构造函数及其描述。
包 - org.apache.tika
类 - Tika
序号 | 构造函数和说明 |
---|---|
1 |
Tika() 使用默认配置并构造 Tika 类。 |
2 |
Tika(Detector detector) 通过接受检测器实例作为参数来创建 Tika facade。 |
3 |
Tika(Detector detector, Parser parser) 通过接受检测器和解析器实例作为参数来创建 Tika facade。 |
4 |
Tika(Detector detector, Parser parser, Translator translator) 通过接受检测器、解析器和翻译器实例作为参数来创建 Tika facade。 |
5 |
Tika(TikaConfig config) 通过接受 TikaConfig 类的对象作为参数来创建 Tika facade。 |
方法和说明
以下是 Tika facade 类的重要方法:
序号 | 方法和说明 |
---|---|
1 |
parseToString(File file) 此方法及其所有变体都会解析作为参数传递的文件,并以字符串格式返回提取的文本内容。默认情况下,此字符串参数的长度是有限制的。 |
2 |
int getMaxStringLength() 返回 parseToString 方法返回的字符串的最大长度。 |
3 |
void setMaxStringLength(int maxStringLength) 设置 parseToString 方法返回的字符串的最大长度。 |
4 |
Reader parse(File file) 此方法及其所有变体都会解析作为参数传递的文件,并以 java.io.reader 对象的形式返回提取的文本内容。 |
5 |
String detect(InputStream stream, Metadata metadata) 此方法及其所有变体接受 InputStream 对象和 Metadata 对象作为参数,检测给定文档的类型,并以 String 对象的形式返回文档类型名称。此方法隐藏了 Tika 使用的检测机制。 |
6 |
String translate(InputStream text, String targetLanguage) 此方法及其所有变体接受 InputStream 对象和一个表示我们希望将文本翻译成的语言的字符串,并将给定文本翻译成所需的语言,尝试自动检测源语言。 |
解析器接口
这是 Tika 包的所有解析器类实现的接口。
包 - org.apache.tika.parser
接口 - Parser
方法和说明
以下是 Tika Parser 接口的重要方法:
序号 | 方法和说明 |
---|---|
1 |
parse(InputStream stream, ContentHandler handler, Metadata metadata, ParseContext context) 此方法将给定文档解析为一系列 XHTML 和 SAX 事件。解析后,它将提取的文档内容放入 ContentHandler 类的对象中,并将元数据放入 Metadata 类的对象中。 |
Metadata 类
此类实现了各种接口,例如 CreativeCommons、Geographic、HttpHeaders、Message、MSOffice、ClimateForcast、TIFF、TikaMetadataKeys、TikaMimeKeys、Serializable,以支持各种数据模型。下表列出了此类的构造函数和方法及其描述。
包 - org.apache.tika.metadata
类 - Metadata
序号 | 构造函数和说明 |
---|---|
1 |
Metadata() 构造一个新的空元数据。 |
序号 | 方法和说明 |
---|---|
1 |
add(Property property, String value) 将元数据属性/值映射添加到给定文档。使用此函数,我们可以将值设置为属性。 |
2 |
add(String name, String value) 将元数据属性/值映射添加到给定文档。使用此方法,我们可以将新的名称值设置为文档的现有元数据。 |
3 |
String get(Property property) 返回给定元数据属性的值(如果有)。 |
4 |
String get(String name) 返回给定元数据名称的值(如果有)。 |
5 |
Date getDate(Property property) 返回 Date 元数据属性的值。 |
6 |
String[] getValues(Property property) 返回元数据属性的所有值。 |
7 |
String[] getValues(String name) 返回给定元数据名称的所有值。 |
8 |
String[] names() 返回元数据对象中元数据元素的所有名称。 |
9 |
set(Property property, Date date) 设置给定元数据属性的日期值 |
10 |
set(Property property, String[] values) 将多个值设置为元数据属性。 |
Language Identifier 类
此类识别给定内容的语言。下表列出了此类的构造函数及其描述。
包 - org.apache.tika.language
类 - LanguageIdentifier
序号 | 构造函数和说明 |
---|---|
1 |
LanguageIdentifier(LanguageProfile profile) 实例化语言识别器。在这里,您必须将 LanguageProfile 对象作为参数传递。 |
2 |
LanguageIdentifier(String content) 此构造函数可以通过传递文本内容的字符串来实例化语言识别器。 |
序号 | 方法和说明 |
---|---|
1 |
String getLanguage() 返回给定当前 LanguageIdentifier 对象的语言。 |
TIKA - 文件格式
Tika 支持的文件格式
下表显示了 Tika 支持的文件格式。
文件格式 | 包库 | Tika 中的类 |
---|---|---|
XML | org.apache.tika.parser.xml | XMLParser |
HTML | org.apache.tika.parser.html,并使用 Tagsoup 库 | HtmlParser |
MS-Office 复合文档 Ole2(2007 年以前)和 ooxml(2007 年及以后) | org.apache.tika.parser.microsoft org.apache.tika.parser.microsoft.ooxml,并使用 Apache Poi 库 |
OfficeParser (ole2) OOXMLParser (ooxml) |
OpenDocument 格式 (OpenOffice) | org.apache.tika.parser.odf | OpenOfficeParser |
便携式文档格式 (PDF) | org.apache.tika.parser.pdf,此包使用 Apache PdfBox 库 | PDFParser |
电子出版物格式(电子书) | org.apache.tika.parser.epub | EpubParser |
富文本格式 | org.apache.tika.parser.rtf | RTFParser |
压缩和打包格式 | org.apache.tika.parser.pkg,此包使用 Common Compress 库 | PackageParser 和 CompressorParser 及其子类 |
文本格式 | org.apache.tika.parser.txt | TXTParser |
Feed 和聚合格式 | org.apache.tika.parser.feed | FeedParser |
音频格式 | org.apache.tika.parser.audio 和 org.apache.tika.parser.mp3 | AudioParser、MidiParser、Mp3Parser(用于 mp3 解析) |
图像解析器 | org.apache.tika.parser.jpeg | JpegParser(用于 jpeg 图片) |
视频格式 | org.apache.tika.parser.mp4 和 org.apache.tika.parser.video,此解析器内部使用简单的算法来解析 Flash 视频格式 | Mp4Parser、FlvParser |
Java 类文件和 jar 文件 | org.apache.tika.parser.asm | ClassParser、CompressorParser |
mbox 格式(电子邮件) | org.apache.tika.parser.mbox | MboxParser |
CAD 格式 | org.apache.tika.parser.dwg | DWGParser |
字体格式 | org.apache.tika.parser.font | TrueTypeParser |
可执行程序和库 | org.apache.tika.parser.executable | ExecutableParser |
TIKA - 文档类型检测
MIME 标准
多用途互联网邮件扩展 (MIME) 标准是识别文档类型的最佳可用标准。了解这些标准有助于浏览器在内部交互期间进行操作。
当浏览器遇到媒体文件时,它会选择与其兼容的可用软件来显示其内容。如果它没有任何合适的应用程序来运行特定的媒体文件,它会建议用户获取合适的插件软件。
Tika 中的类型检测
Tika 支持 MIME 中提供的所有互联网媒体文档类型。当文件通过 Tika 传递时,它会检测文件及其文档类型。为了检测媒体类型,Tika 内部使用以下机制。
文件扩展名
检查文件扩展名是检测文件格式最简单、最常用的方法。许多应用程序和操作系统都支持这些扩展名。以下是几种已知文件类型的扩展名。
文件名 | 扩展名 |
---|---|
图像 | .jpg |
音频 | .mp3 |
Java 存档文件 | .jar |
Java 类文件 | .class |
内容类型提示
当您从数据库检索文件或将其附加到另一个文档时,您可能会丢失文件的名称或扩展名。在这种情况下,使用与文件一起提供的元数据来检测文件扩展名。
魔数字节
观察文件的原始字节,您可以找到每个文件的一些独特的字符模式。某些文件具有特殊的字节前缀,称为**魔数字节**,这些字节是专门制作并包含在文件中用于识别文件类型的。
例如,您可以在 Java 文件中找到 CA FE BA BE(十六进制格式),在 PDF 文件中找到 %PDF(ASCII 格式)。Tika 使用此信息来识别文件的媒体类型。
字符编码
包含纯文本的文件使用不同类型的字符编码进行编码。这里的主要挑战是识别文件中使用的字符编码类型。Tika 使用**BOM 标记**和**字节频率**等字符编码技术来识别纯文本内容使用的编码系统。
XML 根字符
为了检测 XML 文档,Tika 解析 XML 文档并提取信息,例如根元素、命名空间和引用的模式,从中可以找到文件的真实媒体类型。
使用外观类进行类型检测
外观类的 `detect()` 方法用于检测文档类型。此方法接受文件作为输入。以下是使用 Tika 外观类进行文档类型检测的示例程序。
import java.io.File; import org.apache.tika.Tika; public class Typedetection { public static void main(String[] args) throws Exception { //assume example.mp3 is in your current directory File file = new File("example.mp3");// //Instantiating tika facade class Tika tika = new Tika(); //detecting the file type using detect method String filetype = tika.detect(file); System.out.println(filetype); } }
将上述代码保存为 TypeDetection.java,并使用以下命令从命令提示符运行它:
javac TypeDetection.java java TypeDetection audio/mpeg
TIKA - 内容提取
Tika 使用各种解析器库从给定的解析器中提取内容。它选择正确的解析器来提取给定的文档类型。
为了解析文档,通常使用 Tika 外观类的 `parseToString()` 方法。以下是解析过程中涉及的步骤,这些步骤由 Tika ParsertoString() 方法进行抽象。
抽象解析过程:
最初,当我们将文档传递给 Tika 时,它会使用其可用的合适的类型检测机制并检测文档类型。
一旦知道文档类型,它就会从其解析器存储库中选择合适的解析器。解析器存储库包含使用外部库的类。
然后将文档传递给选择的解析器,该解析器将解析内容、提取文本,并为不可读的格式抛出异常。
使用 Tika 进行内容提取
以下是使用 Tika 外观类从文件中提取文本的程序:
import java.io.File; import java.io.IOException; import org.apache.tika.Tika; import org.apache.tika.exception.TikaException; import org.xml.sax.SAXException; public class TikaExtraction { public static void main(final String[] args) throws IOException, TikaException { //Assume sample.txt is in your current directory File file = new File("sample.txt"); //Instantiating Tika facade class Tika tika = new Tika(); String filecontent = tika.parseToString(file); System.out.println("Extracted Content: " + filecontent); } }
将上述代码保存为 TikaExtraction.java,并从命令提示符运行它:
javac TikaExtraction.java java TikaExtraction
以下是 sample.txt 的内容。
Hi students welcome to tutorialspoint
它会给出以下输出:
Extracted Content: Hi students welcome to tutorialspoint
使用解析器接口进行内容提取
Tika 的解析器包提供了几个接口和类,我们可以使用它们来解析文本文档。以下是 **org.apache.tika.parser** 包的框图。
有几个可用的解析器类,例如 pdf 解析器、Mp3Passer、OfficeParser 等,用于分别解析各个文档。所有这些类都实现了解析器接口。
CompositeParser
该图显示了 Tika 的通用解析器类:**CompositeParser** 和 **AutoDetectParser**。由于 CompositeParser 类遵循组合设计模式,您可以将一组解析器实例用作单个解析器。CompositeParser 类还允许访问实现解析器接口的所有类。
AutoDetectParser
这是 CompositeParser 的子类,它提供自动类型检测。使用此功能,AutoDetectParser 使用组合方法自动将传入的文档发送到相应的解析器类。
parse() 方法
除了 `parseToString()` 之外,您还可以使用解析器接口的 `parse()` 方法。此方法的原型如下所示。
parse(InputStream stream, ContentHandler handler, Metadata metadata, ParseContext context)
下表列出了它作为参数接受的四个对象。
序号 | 对象和说明 |
---|---|
1 |
InputStream stream 任何包含文件内容的 Inputstream 对象 |
2 |
ContentHandler handler Tika 将文档作为 XHTML 内容传递给此处理程序,然后使用 SAX API 处理文档。它提供对文档中内容的高效后处理。 |
3 |
Metadata metadata 元数据对象既用作文档元数据的源,也用作目标。 |
4 |
ParseContext context 当客户端应用程序想要自定义解析过程时,使用此对象。 |
示例
以下是显示如何使用 `parse()` 方法的示例。
**步骤 1**:
要使用解析器接口的 `parse()` 方法,请实例化为此接口提供实现的任何类。
有一些单独的解析器类,例如 PDFParser、OfficeParser、XMLParser 等。您可以使用任何这些单独的文档解析器。或者,您可以使用 CompositeParser 或 AutoDetectParser,它在内部使用所有解析器类,并使用合适的解析器提取文档的内容。
Parser parser = new AutoDetectParser(); (or) Parser parser = new CompositeParser(); (or) object of any individual parsers given in Tika Library
**步骤 2**:
创建处理程序类对象。以下是三个内容处理程序:
序号 | 类和说明 |
---|---|
1 |
BodyContentHandler 此类选择 XHTML 输出的主体部分并将该内容写入输出写入器或输出流。然后它将 XHTML 内容重定向到另一个内容处理程序实例。 |
2 |
LinkContentHandler 此类检测并选择 XHTML 文档的所有 H-Ref 标签,并将其转发给 Web 抓取工具等工具使用。 |
3 |
TeeContentHandler 此类有助于同时使用多种工具。 |
由于我们的目标是从文档中提取文本内容,因此请按如下所示实例化 BodyContentHandler:
BodyContentHandler handler = new BodyContentHandler( );
**步骤 3**:
创建元数据对象,如下所示:
Metadata metadata = new Metadata();
**步骤 4**:
创建任何输入流对象,并将应从中提取的文件传递给它。
FileInputstream
通过将文件路径作为参数传递来实例化文件对象,并将此对象传递给 FileInputStream 类的构造函数。
**注意**:传递给文件对象的路径不应包含空格。
这些输入流类的问题在于它们不支持随机访问读取,而这对于有效处理某些文件格式是必需的。为了解决这个问题,Tika 提供了 TikaInputStream。
File file = new File(filepath) FileInputStream inputstream = new FileInputStream(file); (or) InputStream stream = TikaInputStream.get(new File(filename));
**步骤 5**:
创建解析上下文对象,如下所示:
ParseContext context =new ParseContext();
**步骤 6**:
实例化解析器对象,调用 parse 方法,并传递所有必需的对象,如下所示:
parser.parse(inputstream, handler, metadata, context);
以下是使用解析器接口进行内容提取的程序:
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.AutoDetectParser; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.Parser; import org.apache.tika.sax.BodyContentHandler; import org.xml.sax.SAXException; public class ParserExtraction { public static void main(final String[] args) throws IOException,SAXException, TikaException { //Assume sample.txt is in your current directory File file = new File("sample.txt"); //parse method parameters Parser parser = new AutoDetectParser(); BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream inputstream = new FileInputStream(file); ParseContext context = new ParseContext(); //parsing the file parser.parse(inputstream, handler, metadata, context); System.out.println("File content : " + Handler.toString()); } }
将上述代码保存为 ParserExtraction.java,并从命令提示符运行它:
javac ParserExtraction.java java ParserExtraction
以下是 sample.txt 的内容
Hi students welcome to tutorialspoint
如果执行上述程序,它将给出以下输出:
File content : Hi students welcome to tutorialspoint
TIKA - 元数据提取
除了内容外,Tika 还会从文件中提取元数据。元数据只不过是与文件一起提供的附加信息。如果我们考虑一个音频文件,艺术家姓名、专辑名称、标题都属于元数据。
XMP 标准
可扩展元数据平台 (XMP) 是用于处理和存储与文件内容相关信息的标准。它由Adobe Systems Inc创建。XMP 提供定义、创建和处理元数据的标准。您可以将此标准嵌入到多种文件格式中,例如PDF、JPEG、JPEG 2000、GIF、PNG、HTML等。
属性类
Tika 使用 Property 类来遵循 XMP 属性定义。它提供PropertyType和ValueType枚举来捕获元数据的名称和值。
Metadata 类
此类实现各种接口,例如 ClimateForcast、CativeCommons、Geographic 和 TIFF 等,以提供对各种元数据模型的支持。此外,此类还提供多种方法来提取文件中的内容。
元数据名称
我们可以使用 names() 方法从文件的元数据对象中提取所有元数据名称列表。它返回所有名称作为字符串数组。使用元数据名称,我们可以使用 **get()** 方法获取值。它接收一个元数据名称并返回与其关联的值。
String[] metadaNames = metadata.names(); String value = metadata.get(name);
使用 Parse 方法提取元数据
每当我们使用 parse() 解析文件时,我们都会将一个空的元数据对象作为参数之一传递。此方法提取给定文件的元数据(如果该文件包含任何元数据),并将它们放入元数据对象中。因此,使用 parse() 解析文件后,我们可以从该对象中提取元数据。
Parser parser = new AutoDetectParser(); BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); //empty metadata object FileInputStream inputstream = new FileInputStream(file); ParseContext context = new ParseContext(); parser.parse(inputstream, handler, metadata, context); // now this metadata object contains the extracted metadata of the given file. metadata.metadata.names();
以下是从文本文件提取元数据的完整程序。
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.AutoDetectParser; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.Parser; import org.apache.tika.sax.BodyContentHandler; import org.xml.sax.SAXException; public class GetMetadata { public static void main(final String[] args) throws IOException, TikaException { //Assume that boy.jpg is in your current directory File file = new File("boy.jpg"); //Parser method parameters Parser parser = new AutoDetectParser(); BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream inputstream = new FileInputStream(file); ParseContext context = new ParseContext(); parser.parse(inputstream, handler, metadata, context); System.out.println(handler.toString()); //getting the list of all meta data elements String[] metadataNames = metadata.names(); for(String name : metadataNames) { System.out.println(name + ": " + metadata.get(name)); } } }
将上述代码保存为 GetMetadata.java,并使用以下命令从命令提示符运行它:
javac GetMetadata .java java GetMetadata
以下是 boy.jpg 的快照
如果执行上述程序,它将给出以下输出:
X-Parsed-By: org.apache.tika.parser.DefaultParser Resolution Units: inch Compression Type: Baseline Data Precision: 8 bits Number of Components: 3 tiff:ImageLength: 3000 Component 2: Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert Component 1: Y component: Quantization table 0, Sampling factors 2 horiz/2 vert Image Height: 3000 pixels X Resolution: 300 dots Original Transmission Reference: 53616c7465645f5f2368da84ca932841b336ac1a49edb1a93fae938b8db2cb3ec9cc4dc28d7383f1 Image Width: 4000 pixels IPTC-NAA record: 92 bytes binary data Component 3: Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert tiff:BitsPerSample: 8 Application Record Version: 4 tiff:ImageWidth: 4000 Content-Type: image/jpeg Y Resolution: 300 dots
我们也可以获取我们想要的元数据值。
添加新的元数据值
我们可以使用元数据类的 add() 方法添加新的元数据值。以下是此方法的语法。在这里,我们添加作者姓名。
metadata.add(“author”,”Tutorials point”);
Metadata 类具有预定义的属性,包括从 ClimateForcast、CativeCommons、Geographic 等类继承的属性,以支持各种数据模型。下面显示的是 Tika 实现的 TIFF 接口继承的 SOFTWARE 数据类型的用法,以遵循 TIFF 图像格式的 XMP 元数据标准。
metadata.add(Metadata.SOFTWARE,"ms paint");
以下是演示如何向给定文件添加元数据值的完整程序。此处在输出中显示元数据元素列表,以便您可以观察添加新值后列表的变化。
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Arrays; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.AutoDetectParser; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.Parser; import org.apache.tika.sax.BodyContentHandler; import org.xml.sax.SAXException; public class AddMetadata { public static void main(final String[] args) throws IOException, SAXException, TikaException { //create a file object and assume sample.txt is in your current directory File file = new File("Example.txt"); //Parser method parameters Parser parser = new AutoDetectParser(); BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream inputstream = new FileInputStream(file); ParseContext context = new ParseContext(); //parsing the document parser.parse(inputstream, handler, metadata, context); //list of meta data elements before adding new elements System.out.println( " metadata elements :" +Arrays.toString(metadata.names())); //adding new meta data name value pair metadata.add("Author","Tutorials Point"); System.out.println(" metadata name value pair is successfully added"); //printing all the meta data elements after adding new elements System.out.println("Here is the list of all the metadata elements after adding new elements"); System.out.println( Arrays.toString(metadata.names())); } }
将上述代码保存为 AddMetadata.java 类,并从命令提示符运行它:
javac AddMetadata .java java AddMetadata
以下是 Example.txt 的内容
Hi students welcome to tutorialspoint
如果执行上述程序,它将给出以下输出:
metadata elements of the given file : [Content-Encoding, Content-Type] enter the number of metadata name value pairs to be added 1 enter metadata1name: Author enter metadata1value: Tutorials point metadata name value pair is successfully added Here is the list of all the metadata elements after adding new elements [Content-Encoding, Author, Content-Type]
将值设置为现有元数据元素
您可以使用 set() 方法将值设置为现有元数据元素。使用 set() 方法设置 date 属性的语法如下:
metadata.set(Metadata.DATE, new Date());
您还可以使用 set() 方法将多个值设置为属性。使用 set() 方法将多个值设置为 Author 属性的语法如下:
metadata.set(Metadata.AUTHOR, "ram ,raheem ,robin ");
以下是演示 set() 方法的完整程序。
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Date; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.AutoDetectParser; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.Parser; import org.apache.tika.sax.BodyContentHandler; import org.xml.sax.SAXException; public class SetMetadata { public static void main(final String[] args) throws IOException,SAXException, TikaException { //Create a file object and assume example.txt is in your current directory File file = new File("example.txt"); //parameters of parse() method Parser parser = new AutoDetectParser(); BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream inputstream = new FileInputStream(file); ParseContext context = new ParseContext(); //Parsing the given file parser.parse(inputstream, handler, metadata, context); //list of meta data elements elements System.out.println( " metadata elements and values of the given file :"); String[] metadataNamesb4 = metadata.names(); for(String name : metadataNamesb4) { System.out.println(name + ": " + metadata.get(name)); } //setting date meta data metadata.set(Metadata.DATE, new Date()); //setting multiple values to author property metadata.set(Metadata.AUTHOR, "ram ,raheem ,robin "); //printing all the meta data elements with new elements System.out.println("List of all the metadata elements after adding new elements "); String[] metadataNamesafter = metadata.names(); for(String name : metadataNamesafter) { System.out.println(name + ": " + metadata.get(name)); } } }
将上述代码保存为 SetMetadata.java,并从命令提示符运行它:
javac SetMetadata.java java SetMetadata
以下是 example.txt 的内容。
Hi students welcome to tutorialspoint
如果执行上述程序,将得到以下输出。在输出中,您可以观察到新添加的元数据元素。
metadata elements and values of the given file : Content-Encoding: ISO-8859-1 Content-Type: text/plain; charset = ISO-8859-1 Here is the list of all the metadata elements after adding new elements date: 2014-09-24T07:01:32Z Content-Encoding: ISO-8859-1 Author: ram, raheem, robin Content-Type: text/plain; charset = ISO-8859-1
TIKA - 语言检测
语言检测的必要性
对于基于多语言网站中所写语言对文档进行分类,需要一个语言检测工具。此工具应接受没有语言注释(元数据)的文档,并通过检测语言在文档的元数据中添加该信息。
用于分析语料库的算法
什么是语料库?
为了检测文档的语言,会构建语言配置文件并将其与已知语言的配置文件进行比较。这些已知语言的文本集称为 **语料库**。
语料库是书面语言文本的集合,它解释了如何在实际情况下使用该语言。
语料库是从书籍、成绩单和其他数据资源(如互联网)中开发的。语料库的准确性取决于我们用来构建语料库的分析算法。
什么是分析算法?
检测语言的常用方法是使用字典。给定文本中使用的单词将与字典中的单词进行匹配。
在一个语言中使用的常用词列表将是检测特定语言最简单有效的语料库,例如,英语中的冠词 **a**、**an**、**the**。
使用词集作为语料库
使用词集,构建一个简单的算法来查找两个语料库之间的距离,这将等于匹配词的频率差异之和。
此类算法存在以下问题:
由于匹配词的频率非常低,因此该算法无法有效地处理只有几句话的小文本。它需要大量的文本才能进行准确匹配。
它无法检测具有复合句的语言的词边界,以及那些没有空格或标点符号等词分隔符的语言的词边界。
由于使用词集作为语料库存在这些困难,因此会考虑单个字符或字符组。
使用字符集作为语料库
由于在一个语言中常用的字符数量有限,因此很容易应用基于词频而不是字符的算法。对于一种或极少数语言使用的某些字符集,此算法效果更好。
此算法存在以下缺点:
难以区分字符频率相似的两种语言。
没有特定的工具或算法可以专门利用(作为语料库)多种语言使用的字符集来识别一种语言。
N 元语法算法
上述缺点导致了一种新的方法,即使用给定长度的字符序列来分析语料库。这样的字符序列通常称为 N 元语法,其中 N 代表字符序列的长度。
N 元语法算法是有效的语言检测方法,尤其是在英语等欧洲语言的情况下。
此算法适用于短文本。
尽管存在更高级的语言分析算法来检测多语言文档中的多种语言,并具有更具吸引力的功能,但 Tika 使用 3 元语法算法,因为它适用于大多数实际情况。
Tika 中的语言检测
在 ISO 639-1 标准化的所有 184 种标准语言中,Tika 可以检测 18 种语言。Tika 中的语言检测是使用 **LanguageIdentifier** 类的 **getLanguage()** 方法完成的。此方法以字符串格式返回语言的代码名称。以下是 Tika 检测到的 18 个语言代码对列表:
da——丹麦语 | de——德语 | et——爱沙尼亚语 | el——希腊语 |
en——英语 | es——西班牙语 | fi——芬兰语 | fr——法语 |
hu——匈牙利语 | is——冰岛语 | it——意大利语 | nl——荷兰语 |
no——挪威语 | pl——波兰语 | pt——葡萄牙语 | ru——俄语 |
sv——瑞典语 | th——泰语 |
实例化 **LanguageIdentifier** 类时,应传递要提取的内容的字符串格式或 **LanguageProfile** 类对象。
LanguageIdentifier object = new LanguageIdentifier(“this is english”);
以下是 Tika 中语言检测的示例程序。
import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.language.LanguageIdentifier; import org.xml.sax.SAXException; public class LanguageDetection { public static void main(String args[])throws IOException, SAXException, TikaException { LanguageIdentifier identifier = new LanguageIdentifier("this is english "); String language = identifier.getLanguage(); System.out.println("Language of the given content is : " + language); } }
将上述代码保存为 **LanguageDetection.java**,并使用以下命令从命令提示符运行它:
javac LanguageDetection.java java LanguageDetection
如果执行上述程序,则会得到以下输出:
Language of the given content is : en
文档的语言检测
要检测给定文档的语言,必须使用 parse() 方法对其进行解析。parse() 方法解析内容并将其存储在作为参数之一传递给它的处理程序对象中。将处理程序对象的字符串格式传递给 **LanguageIdentifier** 类的构造函数,如下所示:
parser.parse(inputstream, handler, metadata, context); LanguageIdentifier object = new LanguageIdentifier(handler.toString());
以下是演示如何检测给定文档的语言的完整程序:
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.AutoDetectParser; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.Parser; import org.apache.tika.sax.BodyContentHandler; import org.apache.tika.language.*; import org.xml.sax.SAXException; public class DocumentLanguageDetection { public static void main(final String[] args) throws IOException, SAXException, TikaException { //Instantiating a file object File file = new File("Example.txt"); //Parser method parameters Parser parser = new AutoDetectParser(); BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream content = new FileInputStream(file); //Parsing the given document parser.parse(content, handler, metadata, new ParseContext()); LanguageIdentifier object = new LanguageIdentifier(handler.toString()); System.out.println("Language name :" + object.getLanguage()); } }
将上述代码保存为 SetMetadata.java,并从命令提示符运行它:
javac SetMetadata.java java SetMetadata
以下是 Example.txt 的内容。
Hi students welcome to tutorialspoint
如果执行上述程序,它将给出以下输出:
Language name :en
除了 Tika jar 之外,Tika 还提供了一个图形用户界面应用程序 (GUI) 和一个命令行界面 (CLI) 应用程序。您可以像其他 Java 应用程序一样,从命令提示符执行 Tika 应用程序。
TIKA - 图形用户界面 (GUI)
图形用户界面 (GUI)
Tika 在以下链接 https://tika.apache.org/download.html 中提供其源代码及其 jar 文件。
下载这两个文件,设置 jar 文件的类路径。
解压缩源代码 zip 文件夹,打开 tika-app 文件夹。
在解压缩的文件夹“tika-1.6\tika-app\src\main\java\org\apache\Tika\gui”中,您将看到两个类文件:**ParsingTransferHandler.java** 和 **TikaGUI.java**。
编译这两个类文件并执行 TikaGUI.java 类文件,它将打开以下窗口。
现在让我们看看如何使用 Tika GUI。
在 GUI 上,单击打开,浏览并选择要提取的文件,或将其拖放到窗口的空白处。
Tika 提取文件的內容並以五種不同的格式顯示它,即元數據、格式化文本、純文本、主要內容和結構化文本。您可以選擇任何您想要的格式。
同样,您还将在“tika-1.6\tikaapp\src\main\java\org\apache\tika\cli”文件夹中找到 CLI 类。
下图显示了 Tika 的功能。当我们将图像拖放到 GUI 上时,Tika 会提取并显示其元数据。
TIKA - 提取 PDF
以下是从 PDF 提取内容和元数据的程序。
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.pdf.PDFParser; import org.apache.tika.sax.BodyContentHandler; import org.xml.sax.SAXException; public class PdfParse { public static void main(final String[] args) throws IOException,TikaException { BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream inputstream = new FileInputStream(new File("Example.pdf")); ParseContext pcontext = new ParseContext(); //parsing the document using PDF parser PDFParser pdfparser = new PDFParser(); pdfparser.parse(inputstream, handler, metadata,pcontext); //getting the content of the document System.out.println("Contents of the PDF :" + handler.toString()); //getting metadata of the document System.out.println("Metadata of the PDF:"); String[] metadataNames = metadata.names(); for(String name : metadataNames) { System.out.println(name+ " : " + metadata.get(name)); } } }
将上述代码保存为 **PdfParse.java**,并使用以下命令从命令提示符编译它:
javac PdfParse.java java PdfParse
以下是 example.pdf 的快照
我们传递的 PDF 具有以下属性:
编译程序后,您将得到如下所示的输出。
**输出**:
Contents of the PDF: Apache Tika is a framework for content type detection and content extraction which was designed by Apache software foundation. It detects and extracts metadata and structured text content from different types of documents such as spreadsheets, text documents, images or PDFs including audio or video input formats to certain extent. Metadata of the PDF: dcterms:modified : 2014-09-28T12:31:16Z meta:creation-date : 2014-09-28T12:31:16Z meta:save-date : 2014-09-28T12:31:16Z dc:creator : Krishna Kasyap pdf:PDFVersion : 1.5 Last-Modified : 2014-09-28T12:31:16Z Author : Krishna Kasyap dcterms:created : 2014-09-28T12:31:16Z date : 2014-09-28T12:31:16Z modified : 2014-09-28T12:31:16Z creator : Krishna Kasyap xmpTPg:NPages : 1 Creation-Date : 2014-09-28T12:31:16Z pdf:encrypted : false meta:author : Krishna Kasyap created : Sun Sep 28 05:31:16 PDT 2014 dc:format : application/pdf; version = 1.5 producer : Microsoft® Word 2013 Content-Type : application/pdf xmp:CreatorTool : Microsoft® Word 2013 Last-Save-Date : 2014-09-28T12:31:16Z
TIKA - 提取 ODF
以下是从开放文档格式 (ODF) 提取内容和元数据的程序。
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.odf.OpenDocumentParser; import org.apache.tika.sax.BodyContentHandler; import org.xml.sax.SAXException; public class OpenDocumentParse { public static void main(final String[] args) throws IOException,SAXException, TikaException { //detecting the file type BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream inputstream = new FileInputStream(new File("example_open_document_presentation.odp")); ParseContext pcontext = new ParseContext(); //Open Document Parser OpenDocumentParser openofficeparser = new OpenDocumentParser (); openofficeparser.parse(inputstream, handler, metadata,pcontext); System.out.println("Contents of the document:" + handler.toString()); System.out.println("Metadata of the document:"); String[] metadataNames = metadata.names(); for(String name : metadataNames) { System.out.println(name + " : " + metadata.get(name)); } } }
将以上代码保存为OpenDocumentParse.java,然后使用以下命令在命令提示符中编译:
javac OpenDocumentParse.java java OpenDocumentParse
以下是example_open_document_presentation.odp文件的快照。
此文档具有以下属性:
编译程序后,您将获得以下输出。
**输出**:
Contents of the document: Apache Tika Apache Tika is a framework for content type detection and content extraction which was designed by Apache software foundation. It detects and extracts metadata and structured text content from different types of documents such as spreadsheets, text documents, images or PDFs including audio or video input formats to certain extent. Metadata of the document: editing-cycles: 4 meta:creation-date: 2009-04-16T11:32:32.86 dcterms:modified: 2014-09-28T07:46:13.03 meta:save-date: 2014-09-28T07:46:13.03 Last-Modified: 2014-09-28T07:46:13.03 dcterms:created: 2009-04-16T11:32:32.86 date: 2014-09-28T07:46:13.03 modified: 2014-09-28T07:46:13.03 nbObject: 36 Edit-Time: PT32M6S Creation-Date: 2009-04-16T11:32:32.86 Object-Count: 36 meta:object-count: 36 generator: OpenOffice/4.1.0$Win32 OpenOffice.org_project/410m18$Build-9764 Content-Type: application/vnd.oasis.opendocument.presentation Last-Save-Date: 2014-09-28T07:46:13.03
TIKA - 提取 MS Office 文件
以下是用于从Microsoft Office文档中提取内容和元数据的程序。
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.microsoft.ooxml.OOXMLParser; import org.apache.tika.sax.BodyContentHandler; import org.xml.sax.SAXException; public class MSExcelParse { public static void main(final String[] args) throws IOException, TikaException { //detecting the file type BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream inputstream = new FileInputStream(new File("example_msExcel.xlsx")); ParseContext pcontext = new ParseContext(); //OOXml parser OOXMLParser msofficeparser = new OOXMLParser (); msofficeparser.parse(inputstream, handler, metadata,pcontext); System.out.println("Contents of the document:" + handler.toString()); System.out.println("Metadata of the document:"); String[] metadataNames = metadata.names(); for(String name : metadataNames) { System.out.println(name + ": " + metadata.get(name)); } } }
将以上代码保存为MSExelParse.java,然后使用以下命令在命令提示符中进行编译:
javac MSExcelParse.java java MSExcelParse
这里我们正在传递以下示例Excel文件。
给定的Excel文件具有以下属性:
执行上述程序后,您将获得以下输出。
**输出**:
Contents of the document: Sheet1 Name Age Designation Salary Ramu 50 Manager 50,000 Raheem 40 Assistant manager 40,000 Robert 30 Superviser 30,000 sita 25 Clerk 25,000 sameer 25 Section in-charge 20,000 Metadata of the document: meta:creation-date: 2006-09-16T00:00:00Z dcterms:modified: 2014-09-28T15:18:41Z meta:save-date: 2014-09-28T15:18:41Z Application-Name: Microsoft Excel extended-properties:Company: dcterms:created: 2006-09-16T00:00:00Z Last-Modified: 2014-09-28T15:18:41Z Application-Version: 15.0300 date: 2014-09-28T15:18:41Z publisher: modified: 2014-09-28T15:18:41Z Creation-Date: 2006-09-16T00:00:00Z extended-properties:AppVersion: 15.0300 protected: false dc:publisher: extended-properties:Application: Microsoft Excel Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet Last-Save-Date: 2014-09-28T15:18:41Z
TIKA - 提取文本文档
以下是用于从文本文档中提取内容和元数据的程序:
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.ParseContext; import org.apache.tika.sax.BodyContentHandler; import org.apache.tika.parser.txt.TXTParser; import org.xml.sax.SAXException; public class TextParser { public static void main(final String[] args) throws IOException,SAXException, TikaException { //detecting the file type BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream inputstream = new FileInputStream(new File("example.txt")); ParseContext pcontext=new ParseContext(); //Text document parser TXTParser TexTParser = new TXTParser(); TexTParser.parse(inputstream, handler, metadata,pcontext); System.out.println("Contents of the document:" + handler.toString()); System.out.println("Metadata of the document:"); String[] metadataNames = metadata.names(); for(String name : metadataNames) { System.out.println(name + " : " + metadata.get(name)); } } }
将以上代码保存为TextParser.java,然后使用以下命令在命令提示符中进行编译:
javac TextParser.java java TextParser
以下是sample.txt文件的快照:
文本文档具有以下属性:
如果执行上述程序,它将提供以下输出。
**输出**:
Contents of the document: At tutorialspoint.com, we strive hard to provide quality tutorials for self-learning purpose in the domains of Academics, Information Technology, Management and Computer Programming Languages. The endeavour started by Mohtashim, an AMU alumni, who is the founder and the managing director of Tutorials Point (I) Pvt. Ltd. He came up with the website tutorialspoint.com in year 2006 with the help of handpicked freelancers, with an array of tutorials for computer programming languages. Metadata of the document: Content-Encoding: windows-1252 Content-Type: text/plain; charset = windows-1252
TIKA - 提取 HTML 文档
以下是用于从HTML文档中提取内容和元数据的程序。
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.html.HtmlParser; import org.apache.tika.sax.BodyContentHandler; import org.xml.sax.SAXException; public class HtmlParse { public static void main(final String[] args) throws IOException,SAXException, TikaException { //detecting the file type BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream inputstream = new FileInputStream(new File("example.html")); ParseContext pcontext = new ParseContext(); //Html parser HtmlParser htmlparser = new HtmlParser(); htmlparser.parse(inputstream, handler, metadata,pcontext); System.out.println("Contents of the document:" + handler.toString()); System.out.println("Metadata of the document:"); String[] metadataNames = metadata.names(); for(String name : metadataNames) { System.out.println(name + ": " + metadata.get(name)); } } }
将以上代码保存为HtmlParse.java,然后使用以下命令在命令提示符中进行编译:
javac HtmlParse.java java HtmlParse
以下是example.txt文件的快照。
HTML文档具有以下属性:
如果执行上述程序,它将提供以下输出。
**输出**:
Contents of the document: Name Salary age Ramesh Raman 50000 20 Shabbir Hussein 70000 25 Umesh Raman 50000 30 Somesh 50000 35 Metadata of the document: title: HTML Table Header Content-Encoding: windows-1252 Content-Type: text/html; charset = windows-1252 dc:title: HTML Table Header
TIKA - 提取 XML 文档
以下是用于从XML文档中提取内容和元数据的程序。
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.xml.XMLParser; import org.apache.tika.sax.BodyContentHandler; import org.xml.sax.SAXException; public class XmlParse { public static void main(final String[] args) throws IOException,SAXException, TikaException { //detecting the file type BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream inputstream = new FileInputStream(new File("pom.xml")); ParseContext pcontext = new ParseContext(); //Xml parser XMLParser xmlparser = new XMLParser(); xmlparser.parse(inputstream, handler, metadata, pcontext); System.out.println("Contents of the document:" + handler.toString()); System.out.println("Metadata of the document:"); String[] metadataNames = metadata.names(); for(String name : metadataNames) { System.out.println(name + ": " + metadata.get(name)); } } }
将以上代码保存为XmlParse.java,然后使用以下命令在命令提示符中进行编译:
javac XmlParse.java java XmlParse
以下是example.xml文件的快照
此文档具有以下属性:
执行上述程序后,您将获得以下输出:
**输出**:
Contents of the document: 4.0.0 org.apache.tika tika 1.6 org.apache.tika tika-core 1.6 org.apache.tika tika-parsers 1.6 src maven-compiler-plugin 3.1 1.7 1.7 Metadata of the document: Content-Type: application/xml
TIKA - 提取 .class 文件
以下是用于从.class文件中提取内容和元数据的程序。
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.asm.ClassParser; import org.apache.tika.sax.BodyContentHandler; import org.xml.sax.SAXException; public class JavaClassParse { public static void main(final String[] args) throws IOException,SAXException, TikaException { //detecting the file type BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream inputstream = new FileInputStream(new File("Example.class")); ParseContext pcontext = new ParseContext(); //Html parser ClassParser ClassParser = new ClassParser(); ClassParser.parse(inputstream, handler, metadata,pcontext); System.out.println("Contents of the document:" + handler.toString()); System.out.println("Metadata of the document:"); String[] metadataNames = metadata.names(); for(String name : metadataNames) { System.out.println(name + " : " + metadata.get(name)); } } }
将以上代码保存为JavaClassParse.java,然后使用以下命令在命令提示符中进行编译:
javac JavaClassParse.java java JavaClassParse
以下是Example.java的快照,编译后将生成Example.class。
Example.class文件具有以下属性:
执行上述程序后,您将获得以下输出。
**输出**:
Contents of the document: package tutorialspoint.tika.examples; public synchronized class Example { public void Example(); public static void main(String[]); } Metadata of the document: title: Example resourceName: Example.class dc:title: Example
TIKA - 提取 JAR 文件
以下是用于从Java归档(jar)文件中提取内容和元数据的程序:
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.ParseContext; import org.apache.tika.sax.BodyContentHandler; import org.apache.tika.parser.pkg.PackageParser; import org.xml.sax.SAXException; public class PackageParse { public static void main(final String[] args) throws IOException,SAXException, TikaException { //detecting the file type BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream inputstream = new FileInputStream(new File("Example.jar")); ParseContext pcontext = new ParseContext(); //Package parser PackageParser packageparser = new PackageParser(); packageparser.parse(inputstream, handler, metadata,pcontext); System.out.println("Contents of the document: " + handler.toString()); System.out.println("Metadata of the document:"); String[] metadataNames = metadata.names(); for(String name : metadataNames) { System.out.println(name + ": " + metadata.get(name)); } } }
将以上代码保存为PackageParse.java,然后使用以下命令在命令提示符中进行编译:
javac PackageParse.java java PackageParse
以下是位于包内的Example.java的快照。
jar文件具有以下属性:
执行上述程序后,它将提供以下输出:
**输出**:
Contents of the document: META-INF/MANIFEST.MF tutorialspoint/tika/examples/Example.class Metadata of the document: Content-Type: application/zip
TIKA - 提取图像文件
以下是用于从JPEG图像中提取内容和元数据的程序。
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.jpeg.JpegParser; import org.apache.tika.sax.BodyContentHandler; import org.xml.sax.SAXException; public class JpegParse { public static void main(final String[] args) throws IOException,SAXException, TikaException { //detecting the file type BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream inputstream = new FileInputStream(new File("boy.jpg")); ParseContext pcontext = new ParseContext(); //Jpeg Parse JpegParser JpegParser = new JpegParser(); JpegParser.parse(inputstream, handler, metadata,pcontext); System.out.println("Contents of the document:" + handler.toString()); System.out.println("Metadata of the document:"); String[] metadataNames = metadata.names(); for(String name : metadataNames) { System.out.println(name + ": " + metadata.get(name)); } } }
将以上代码保存为JpegParse.java,然后使用以下命令在命令提示符中进行编译:
javac JpegParse.java java JpegParse
以下是Example.jpeg的快照:
JPEG文件具有以下属性:
执行程序后,您将获得以下输出。
输出:
Contents of the document: Meta data of the document: Resolution Units: inch Compression Type: Baseline Data Precision: 8 bits Number of Components: 3 tiff:ImageLength: 3000 Component 2: Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert Component 1: Y component: Quantization table 0, Sampling factors 2 horiz/2 vert Image Height: 3000 pixels X Resolution: 300 dots Original Transmission Reference: 53616c7465645f5f2368da84ca932841b336ac1a49edb1a93fae938b8db2cb3ec9cc4dc28d7383f1 Image Width: 4000 pixels IPTC-NAA record: 92 bytes binary data Component 3: Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert tiff:BitsPerSample: 8 Application Record Version: 4 tiff:ImageWidth: 4000 Y Resolution: 300 dots
TIKA - 提取 mp4 文件
以下是用于从mp4文件中提取内容和元数据的程序:
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.mp4.MP4Parser; import org.apache.tika.sax.BodyContentHandler; import org.xml.sax.SAXException; public class Mp4Parse { public static void main(final String[] args) throws IOException,SAXException, TikaException { //detecting the file type BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream inputstream = new FileInputStream(new File("example.mp4")); ParseContext pcontext = new ParseContext(); //Html parser MP4Parser MP4Parser = new MP4Parser(); MP4Parser.parse(inputstream, handler, metadata,pcontext); System.out.println("Contents of the document: :" + handler.toString()); System.out.println("Metadata of the document:"); String[] metadataNames = metadata.names(); for(String name : metadataNames) { System.out.println(name + ": " + metadata.get(name)); } } }
将以上代码保存为JpegParse.java,然后使用以下命令在命令提示符中进行编译:
javac Mp4Parse.java java Mp4Parse
以下是Example.mp4文件属性的快照。
执行上述程序后,您将获得以下输出:
**输出**:
Contents of the document: Metadata of the document: dcterms:modified: 2014-01-06T12:10:27Z meta:creation-date: 1904-01-01T00:00:00Z meta:save-date: 2014-01-06T12:10:27Z Last-Modified: 2014-01-06T12:10:27Z dcterms:created: 1904-01-01T00:00:00Z date: 2014-01-06T12:10:27Z tiff:ImageLength: 360 modified: 2014-01-06T12:10:27Z Creation-Date: 1904-01-01T00:00:00Z tiff:ImageWidth: 640 Content-Type: video/mp4 Last-Save-Date: 2014-01-06T12:10:27Z
TIKA - 提取 mp3 文件
以下是用于从mp3文件中提取内容和元数据的程序:
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.mp3.LyricsHandler; import org.apache.tika.parser.mp3.Mp3Parser; import org.apache.tika.sax.BodyContentHandler; import org.xml.sax.SAXException; public class Mp3Parse { public static void main(final String[] args) throws Exception, IOException, SAXException, TikaException { //detecting the file type BodyContentHandler handler = new BodyContentHandler(); Metadata metadata = new Metadata(); FileInputStream inputstream = new FileInputStream(new File("example.mp3")); ParseContext pcontext = new ParseContext(); //Mp3 parser Mp3Parser Mp3Parser = new Mp3Parser(); Mp3Parser.parse(inputstream, handler, metadata, pcontext); LyricsHandler lyrics = new LyricsHandler(inputstream,handler); while(lyrics.hasLyrics()) { System.out.println(lyrics.toString()); } System.out.println("Contents of the document:" + handler.toString()); System.out.println("Metadata of the document:"); String[] metadataNames = metadata.names(); for(String name : metadataNames) { System.out.println(name + ": " + metadata.get(name)); } } }
将以上代码保存为JpegParse.java,然后使用以下命令在命令提示符中进行编译:
javac Mp3Parse.java java Mp3Parse
Example.mp3文件具有以下属性:
执行程序后,您将获得以下输出。如果给定文件有任何歌词,我们的应用程序将捕获并将其与输出一起显示。
**输出**:
Contents of the document: Kanulanu Thaake Arijit Singh Manam (2014), track 01/06 2014 Soundtrack 30171.65 eng - DRGM Arijit Singh Manam (2014), track 01/06 2014 Soundtrack 30171.65 eng - DRGM Metadata of the document: xmpDM:releaseDate: 2014 xmpDM:duration: 30171.650390625 xmpDM:audioChannelType: Stereo dc:creator: Arijit Singh xmpDM:album: Manam (2014) Author: Arijit Singh xmpDM:artist: Arijit Singh channels: 2 xmpDM:audioSampleRate: 44100 xmpDM:logComment: eng - DRGM xmpDM:trackNumber: 01/06 version: MPEG 3 Layer III Version 1 creator: Arijit Singh xmpDM:composer: Music : Anoop Rubens | Lyrics : Vanamali xmpDM:audioCompressor: MP3 title: Kanulanu Thaake samplerate: 44100 meta:author: Arijit Singh xmpDM:genre: Soundtrack Content-Type: audio/mpeg xmpDM:albumArtist: Manam (2014) dc:title: Kanulanu Thaake