TIKA - 快速指南

TIKA - 概述

什么是 Apache Tika?

  • Apache Tika 是一个用于文档类型检测和从各种文件格式中提取内容的库。

  • 在内部,Tika 使用现有的各种文档解析器和文档类型检测技术来检测和提取数据。

  • 使用 Tika,可以开发通用类型检测器和内容提取器,从不同类型的文档(如电子表格、文本文档、图像、PDF 甚至多媒体输入格式)中提取结构化文本和元数据。

  • Tika 提供了一个通用 API 来解析不同的文件格式。它使用针对每种文档类型的现有专用解析器库。

  • 所有这些解析器库都封装在一个名为 解析器接口 的接口下。

Appache Tika

为什么是 Tika?

根据 filext.com 的数据,内容类型大约有 15k 到 51k 种,而且这个数字还在日益增长。数据以各种格式存储,例如文本文档、excel 电子表格、PDF、图像和多媒体文件等。因此,搜索引擎和内容管理系统等应用程序需要额外的支持,以便轻松从这些文档类型中提取数据。 Apache Tika 通过提供通用 API 来定位和提取多种文件格式中的数据,从而实现此目的。

Apache Tika 应用程序

有各种应用程序使用 Apache Tika。这里我们将讨论一些严重依赖 Apache Tika 的著名应用程序。

搜索引擎

Tika 在开发搜索引擎以索引数字文档的文本内容时被广泛使用。

  • 搜索引擎是旨在从 Web 上搜索信息和索引文档的信息处理系统。

  • 爬虫是搜索引擎的重要组成部分,它通过 Web 进行爬取,使用某种索引技术获取要索引的文档。此后,爬虫将这些索引文档传输到提取组件。

  • 提取组件的职责是从文档中提取文本和元数据。这种提取的内容和元数据对搜索引擎非常有用。此提取组件包含 Tika。

  • 提取的内容随后被传递给搜索引擎的索引器,索引器使用它来构建搜索索引。除此之外,搜索引擎还以许多其他方式使用提取的内容。

Search Engine

文档分析

  • 在人工智能领域,有一些工具可以在语义级别自动分析文档并从中提取各种数据。

  • 在此类应用中,根据文档提取内容中的突出术语对文档进行分类。

  • 这些工具利用 Tika 进行内容提取,以分析从纯文本到数字文档的各种文档。

数字资产管理

  • 一些组织使用一种称为数字资产管理 (DAM) 的特殊应用程序来管理其数字资产,如照片、电子书、绘图、音乐和视频。

  • 此类应用程序借助文档类型检测器和元数据提取器对各种文档进行分类。

内容分析

  • 像亚马逊这样的网站会根据个人用户的兴趣向他们推荐其网站新发布的内容。为此,这些网站遵循机器学习技术,或借助 Facebook 等社交媒体网站来提取所需信息,例如用户的喜好和兴趣。所收集的信息将以 html 标签或其他格式呈现,需要进一步检测和提取内容类型。

  • 对于文档的内容分析,我们拥有实施机器学习技术的技术,例如 UIMAMahout。这些技术可用于聚类和分析文档中的数据。

  • 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 Architecture

语言检测机制

每当将文本文档传递给 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 的最简单、最直接的方式,它遵循 Facade 设计模式。您可以在 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 使用各种检测技术并检测给定文档的类型。

Detection

内容提取

Tika 有一个解析器库,可以解析各种文档格式的内容并提取它们。检测到文档类型后,它会从解析器存储库中选择适当的解析器并传递文档。Tika 的不同类具有解析不同文档格式的方法。

Extraction

元数据提取

除了内容之外,Tika 还使用与内容提取相同的程序提取文档的元数据。对于某些文档类型,Tika 具有用于提取元数据的类。

Extraction1

语言检测

在内部,Tika 遵循 n-gram 等算法来检测给定文档中内容的语言。 Tika 依赖 LanguageidentifierProfiler 等类进行语言识别。

Detection1

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 version "1.7.0_60"

Java (TM) SE Run Time Environment (build 1.7.0_60-b19)

Java Hotspot (TM) 64-bit Server VM (build 24.60-b09, mixed mode)

Lunix

java version "1.7.0_25"

Open JDK Runtime Environment (rhel-2.3.10.4.el6_4-x86_64)

Open JDK 64-Bit Server VM (build 23.7-b01, mixed mode)

步骤 2:设置 Java 环境

设置 JAVA_HOME 环境变量以指向您的计算机上安装 Java 的基本目录位置。例如,

OS 输出
Windows 将环境变量 JAVA_HOME 设置为 C:\ProgramFiles\java\jdk1.7.0_60
Linux export JAVA_HOME = /usr/local/java-current

将 Java 编译器位置的完整路径附加到系统路径。

OS 输出
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官方网站的快照。

Tika Environment

下载文件后,设置jar文件tika-app-1.6.jar的类路径。添加 jar 文件的完整路径,如下表所示。

OS 输出
Windows 将字符串"C:\jars\Tika-app-1.6.jar"附加到用户环境变量 CLASSPATH
Linux

Export CLASSPATH = $CLASSPATH −

/usr/share/jars/Tika-app-1.6.tar −

Apache 提供了 Tika 应用程序,一个使用 Eclipse 的图形用户界面 (GUI) 应用程序。

使用 Eclipse 构建 Tika-Maven

m2e Release
  • 选择最新版本,并在 p2 url 列中保存 url 的路径。

  • 现在重新访问 eclipse,在菜单栏中,单击 帮助,然后从下拉菜单中选择 安装新软件

Eclipse
  • 单击 添加 按钮,输入任何所需的名称,因为它是可选的。现在将保存的 URL 粘贴到 Location 字段中。

  • 将添加一个新插件,其名称与您在上一步中选择的名称相同,选中它前面的复选框,然后单击 Next

Install
  • 继续安装。完成后,重新启动 Eclipse。

  • 现在右键单击项目,然后在 configure 选项中选择 convert to maven project

  • 出现一个用于创建新 pom 的新向导。输入 Group Id 为 org.apache.tika,输入 Tika 的最新版本,选择 packaging 为 jar,然后单击 Finish

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 嵌入到他们的应用程序中。它具有探索 Tika 所有功能的方法。由于它是一个 Facade 类,Tika 抽象了其功能背后的复杂性。除此之外,用户还可以在他们的应用程序中使用 Tika 的各种类。

User Application

Tika 类(facade)

这是 Tika 库中最突出的类,遵循 Facade 设计模式。因此,它抽象了所有内部实现并提供简单的方法来访问 Tika 功能。下表列出了此类的构造函数及其描述。

− org.apache.tika

− Tika

Sr.No. 构造函数 &描述
1

Tika ()

使用默认配置并构造 Tika 类。

2

Tika (Detector 检测器)

通过接受检测器实例作为参数创建 Tika 外观

3

Tika (Detector 检测器,Parser 解析器)

通过接受检测器和解析器实例作为参数创建 Tika 外观。

4

Tika (Detector检测器、Parser解析器、Translator翻译器)

通过接受检测器、解析器和翻译器实例作为参数来创建Tika外观。

5

Tika (TikaConfig配置)

通过接受TikaConfig类的对象作为参数来创建Tika外观。

方法和说明

以下是Tika外观类的重要方法 −

Sr.No. 方法和说明
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

接口 − 解析器

方法和说明

以下是 Tika 解析器接口的重要方法 −

Sr.No. 方法和描述
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,以支持各种数据模型。下表列出了此类的构造函数和方法及其说明。

package − org.apache.tika.metadata

class − 元数据

Sr.No. 构造函数和说明
1

Metadata()

构造一个新的空元数据。

Sr.No. 方法和描述
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)

将多个值设置为元数据属性。

语言标识符类

此类标识给定内容的语言。下表列出了此类的构造函数及其说明。

package − org.apache.tika.language

class − 语言标识符

Sr.No. 构造函数 &描述
1

LanguageIdentifier(LanguageProfile profile)

实例化语言标识符。在这里,您必须传递一个 LanguageProfile 对象作为参数。

2

LanguageIdentifier(String content)

此构造函数可以通过从文本内容传递字符串来实例化语言标识符。

Sr.No. 方法 &描述
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 Format 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,此包使用通用压缩库 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 Mp3- 用于 mp3parser
图像解析器 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
Mobxformat(电子邮件) org.apache.tika.parser.mbox MobXParser
Cad 格式 org.apache.tika.parser.dwg DWGParser
FontFormats 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 文档并提取信息,例如根元素、命名空间和引用的架构,从中可以找到文件的真实媒体类型。

使用 Facade 类进行类型检测

Facade 类的 detect() 方法用于检测文档类型。此方法接受文件作为输入。下面显示的是使用 Tika Facade 类进行文档类型检测的示例程序。

import java.io.File;

import org.apache.tika.Tika;

public class Typedetection {

   public static void main(String[] args) throws Exception {

      //假设 example.mp3 位于当前目录中
      File file = new File("example.mp3");//
      
      //实例化 tika 外观类
      Tika tika = new Tika();
      
      //使用检测方法检测文件类型
      String filetype = tika.detect(file);
      System.out.println(filetype);
   }
}

将上述代码保存为 TypeDetection.java,然后使用以下命令从命令提示符运行它 −

javac TypeDetection.java
java TypeDetection 

audio/mpeg

TIKA - 内容提取

Tika 使用各种解析器库从给定的解析器中提取内容。它选择正确的解析器来提取给定的文档类型。

对于解析文档,通常使用 Tika Facade 类的 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 {

      //假设sample.txt位于当前目录中        
      File file = new File("sample.txt");
      
      //实例化Tika外观类
      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 的通用解析器类:CompositeParserAutoDetectParser。由于 CompositeParser 类遵循复合设计模式,因此您可以将一组解析器实例用作单个解析器。 CompositeParser 类还允许访问实现解析器接口的所有类。

AutoDetectParser

这是 CompositeParser 的子类,它提供自动类型检测。使用此功能,AutoDetectParser 会使用复合方法自动将传入的文档发送到适当的解析器类。

parse() 方法

除了 parseToString() 之外,您还可以使用解析器接口的 parse() 方法。此方法的原型如下所示。

parse(InputStream stream, ContentHandler handler, Metadata metadata, ParseContext context)

下表列出了它接受作为参数的四个对象。

Sr.No. 对象和说明
1

InputStream 流

任何包含文件内容的 Inputstream 对象

2

ContentHandler 处理程序

Tika 将文档作为 XHTML 内容传递给此处理程序,然后使用 SAX API 处理该文档。它提供了对文档内容的有效后处理。

3

元数据元数据

元数据对象既用作文档元数据的源,也用作文档元数据的目标。

4

ParseContext 上下文

此对象用于客户端应用程序想要自定义解析过程的情况。

示例

下面给出了一个示例,展示了如何使用 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

创建一个处理程序类对象。下面给出了三个内容处理程序 −

Sr.No. 类和说明
1

BodyContentHandler

此类选择 XHTML 输出的正文部分并将该内容写入输出编写器或输出流。然后它将 XHTML 内容重定向到另一个内容处理程序实例。

2

LinkContentHandler

此类检测并选择 XHTML 文档的所有 H-Ref 标签,并转发这些标签以供网络爬虫等工具使用。

3

TeeContentHandler

此类有助于同时使用多个工具。

由于我们的目标是从文档中提取文本内容,因此实例化 BodyContentHandler,如下所示 −

BodyContentHandler handler = new BodyContentHandler( );

步骤 3

创建 Metadata 对象,如下所示 −

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

实例化解析器对象,调用解析方法,并传递所需的所有对象,如下面原型所示 −

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 {

      //假设sample.txt位于当前目录中
      File file = new File("sample.txt");
      
      //解析方法参数
      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("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 提供了定义、创建和处理 元数据 的标准。您可以将此标准嵌入到多种文件格式中,例如 PDFJPEGJPEGGIFjpgHTML 等。

Property 类

Tika 使用 Property 类来遵循 XMP 属性定义。它提供 PropertyTypeValueType 枚举来捕获元数据的名称和值。

元数据类

此类实现各种接口,例如 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(); //空元数据对象
FileInputStream inputstream = new FileInputStream(file);
ParseContext context = new ParseContext();
parser.parse(inputstream, handler, metadata, context);

// 现在这个元数据对象包含给定文件的提取元数据。
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 {
	
      //假设 boy.jpg 位于当前目录中
      File file = new File("boy.jpg");

      //解析器方法参数
      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());

      //获取所有元数据元素的列表 
      String[] metadataNames = metadata.names();

      for(String name : metadataNames) {		        
         System.out.println(name + ": " + metadata.get(name));
      }
   }
}

将上述代码保存为 GetMetadata.java,然后使用以下命令从命令提示符运行它 −

javac GetMetadata .java
java GetMetadata

下面给出的是 boy.jpg 的快照

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 {

      //创建一个文件对象并假设sample.txt位于当前目录中
      File file = new File("Example.txt");

      //解析器方法参数
      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( " metadata elements :"  +Arrays.toString(metadata.names()));

      //添加新的元数据名称值对
      metadata.add("Author","Tutorials Point");
      System.out.println(" metadata name value pair is successfully added");
      
      //添加新元素后打印所有元数据元素
      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 {
   
      //创建一个文件对象并假设example.txt位于您当前的目录中
      File file = new File("example.txt");
      
      //parse() 方法的参数
      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( " metadata elements and values of the given file :");
      String[] metadataNamesb4 = metadata.names();
      
      for(String name : metadataNamesb4) {
    	  System.out.println(name + ": " + metadata.get(name));
      }
      
      //设置日期元数据
      metadata.set(Metadata.DATE, new Date());
      
      //为 author 属性设置多个值
      metadata.set(Metadata.AUTHOR, "ram ,raheem ,robin ");
      
      //使用新元素打印所有元数据元素
      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 - 语言检测

语言检测的必要性

为了根据多语言网站中编写的语言对文档进行分类,需要一个语言检测工具。此工具应接受没有语言注释(元数据)的文档,并通过检测语言将该信息添加到文档的元数据中。

用于分析语料库的算法

什么是语料库?

为了检测文档的语言,需要构建语言配置文件并将其与已知语言的配置文件进行比较。这些已知语言的文本集称为语料库

语料库是书面语言的文本集合,用于解释该语言在实际情况下的使用方式。

语料库是从书籍、抄本和其他数据资源(如互联网)开发而来的。语料库的准确性取决于我们用来构建语料库的分析算法。

什么是分析算法?

检测语言的常用方法是使用词典。给定文本中使用的单词将与词典中的单词进行匹配。

一种语言中常用单词的列表将是检测特定语言的最简单和最有效的语料库,例如,英语中的文章aanthe

使用词集作为语料库

使用词集,可以构建一个简单的算法来查找两个语料库之间的距离,该距离等于匹配词频率差异的总和。

这种算法存在以下问题−

  • 由于匹配词的频率非常低,因此该算法无法有效地处理只有少量句子的小文本。它需要大量的文本才能实现准确匹配。

  • 对于具有复合句的语言以及没有空格或标点符号等单词分隔符的语言,它无法检测单词边界。

由于使用词集作为语料库存在这些困难,因此会考虑单个字符或字符组。

使用字符集作为语料库

由于一种语言中常用的字符数量有限,因此很容易应用基于词频而不是字符的算法。如果某些字符集只用于一种或极少数几种语言,该算法的效果会更好。

该算法存在以下缺点 −

  • 很难区分具有相似字符频率的两种语言。

  • 没有特定的工具或算法可以借助多种语言使用的字符集(作为语料库)来专门识别一种语言。

N-gram 算法

上述缺点催生了一种使用给定长度的字符序列来分析语料库的新方法。这种字符序列通常称为 N-gram,其中 N 表示字符序列的长度。

  • N-gram 算法是一种有效的语言检测方法,尤其是对于英语等欧洲语言。

  • 此算法适用于短文本。

  • 尽管有高级语言分析算法可以检测具有更多吸引人特征的多语言文档中的多种语言,但 Tika 使用的是 3-gram 算法,因为它适用于大多数实际情况。

Tika 中的语言检测

在 ISO 639-1 标准化的所有 184 种标准语言中,Tika 可以检测 18 种语言。Tika 中的语言检测是使用 LanguageIdentifier 类的 getLanguage() 方法完成的。此方法以字符串格式返回语言的代码名称。下面是 Tika 检测到的 18 种语言代码对的列表 −

da—Danish de—German et—Estonian el—Greek
en—English es—Spanish fi—Finnish fr—French
hu—Hungarian is—Icelandic it—Italian nl—Dutch
no—Norwegian pl—Polish pt—Portuguese ru—Russian
sv—Swedish th—Thai

实例化 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);
   }
}

将上述代码保存为 LanguageDetection.java,然后使用以下命令从命令提示符运行它 −

javac LanguageDetection.java
java LanguageDetection

如果执行上述程序,它将给出以下输出−

给定内容的语言为: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 {

      //实例化文件对象
      File file = new File("Example.txt");

      //解析器方法参数
      Parser parser = new AutoDetectParser();
      BodyContentHandler handler = new BodyContentHandler();
      Metadata metadata = new Metadata();
      FileInputStream content = new FileInputStream(file);

      //解析给定的文档
      parser.parse(content, handler, metadata, new ParseContext());

      LanguageIdentifier object = new LanguageIdentifier(handler.toString());
      System.out.println("语言名称 :" + object.getLanguage());
   }
}

将上述代码保存为 SetMetadata.java 并从命令提示符运行它 −

javac SetMetadata.java
java SetMetadata

下面给出了 Example.txt 的内容。

Hi students welcome to tutorialspoint

如果执行上述程序,它将为您提供以下输出 −

语言名称 :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 ika-app\src\main\java\org\apache\Tika\gui"中,您将看到两个类文件:ParsingTransferHandler.javaTikaGUI.java

  • 编译类文件并执行 TikaGUI.java 类文件,它会打开以下窗口。

打开窗口

现在让我们看看如何使用 Tika GUI。

在 GUI 上,单击打开,浏览并选择要提取的文件,或将其拖到窗口的空白处。

Tika 提取文件的内容并以五种不同的格式显示,即元数据、格式化文本、纯文本、主要内容和结构化文本。您可以选择任何您想要的格式。

同样,您还可以在"tika-1.6 ikaapp\src\main\java\org\apache ika\cli"文件夹中找到 CLI 类。

下图显示了 Tika 可以做什么。当我们将图像放到 GUI 上时,Tika 会提取并显示其元数据。

GUI

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();
      
      //使用 PDF 解析器解析文档
      PDFParser pdfparser = new PDFParser(); 
      pdfparser.parse(inputstream, handler, metadata,pcontext);
      
      //获取文档的内容
      System.out.println("Contents of the PDF :" + handler.toString());
      
      //获取文档的元数据
      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 示例

我们传递的 PDF 具有以下属性 −

PDF 示例 1

编译程序后,您将获得如下所示的输出。

输出

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.

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

下面给出的是从 Open Office 文档格式 (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 {

      //检测文件类型
      BodyContentHandler handler = new BodyContentHandler();
      Metadata metadata = new Metadata();
      FileInputStream inputstream = new FileInputStream(new File("example_open_document_presentation.odp"));
      ParseContext pcontext = new ParseContext();
      
      //打开文档解析器
      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 文件的快照。

Presentation

此文档具有以下属性 −

Example2

编译程序后,您将获得以下输出。

输出

文档内容:

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. 

文档的元数据:

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 {
      
      //检测文件类型
      BodyContentHandler handler = new BodyContentHandler();
      Metadata metadata = new Metadata();
      FileInputStream inputstream = new FileInputStream(new File("example_msExcel.xlsx"));
      ParseContext pcontext = new ParseContext();
      
      //OOXml解析器
      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 文件。

Passing Excel

给定的 Excel 文件具有以下属性 −

Excel Properties

执行上述程序后,您将获得以下输出。

输出

文档内容:

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

文档的元数据:

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 {

      //检测文件类型
      BodyContentHandler handler = new BodyContentHandler();
      Metadata metadata = new Metadata();
      FileInputStream inputstream = new FileInputStream(new File("example.txt"));
      ParseContext pcontext=new ParseContext();
      
      //文本文档解析器
      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 文件的快照 −

Simple Document

文本文档具有以下属性 −

Document Properties

如果执行上述程序,它将为您提供以下输出。

输出

文档内容:

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 {

      //检测文件类型
      BodyContentHandler handler = new BodyContentHandler();
      Metadata metadata = new Metadata();
      FileInputStream inputstream = new FileInputStream(new File("example.html"));
      ParseContext pcontext = new ParseContext();
      
      //Html解析器
      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 文件的快照。

example

HTML 文档具有以下属性−

Document Properties1

如果执行上述程序,它将为您提供以下输出。

输出

文档内容:

	Name	                     Salary	    age
	Ramesh Raman	             50000	    20
	Shabbir Hussein	             70000          25
	Umesh Raman	             50000	    30
	Somesh	                     50000	    35

文档的元数据:

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 {

      //检测文件类型
      BodyContentHandler handler = new BodyContentHandler();
      Metadata metadata = new Metadata();
      FileInputStream inputstream = new FileInputStream(new File("pom.xml"));
      ParseContext pcontext = new ParseContext();
      
      //Xml解析器
      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 文件的快照

XML Document

此文档具有以下属性 −

XML Document1

如果执行上述程序,它将为您提供以下输出 −

输出

文档内容:
  
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

文档的元数据:

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 {

      //检测文件类型
      BodyContentHandler handler = new BodyContentHandler();
      Metadata metadata = new Metadata();
      FileInputStream inputstream = new FileInputStream(new File("Example.class"));
      ParseContext pcontext = new ParseContext();

      //Html解析器
      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。

JAVA Excel

Example.class 文件具有以下属性 −

Example Class

执行上述程序后,您将获得以下输出。

输出

文档内容:

package tutorialspoint.tika.examples;
public synchronized class Example {
   public void Example();
   public static void main(String[]);
}

文档的元数据:

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 {

      //检测文件类型
      BodyContentHandler handler = new BodyContentHandler();
      Metadata metadata = new Metadata();
      FileInputStream inputstream = new FileInputStream(new File("Example.jar"));
      ParseContext pcontext = new ParseContext();
      
      //包解析器
      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 的快照。

JAVA 示例

jar 文件具有以下属性 −

JAR 示例

执行上述程序后,它将为您提供以下输出 −

输出

文档内容:

META-INF/MANIFEST.MF
tutorialspoint/tika/examples/Example.class

文档的元数据:

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 {

      //检测文件类型
      BodyContentHandler handler = new BodyContentHandler();
      Metadata metadata = new Metadata();
      FileInputStream inputstream = new FileInputStream(new File("boy.jpg"));
      ParseContext pcontext = new ParseContext();
      
      //Jpeg 解析
      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 的快照 −

Baby

JPEG 文件具有以下属性 −

Property

执行程序后,您将获得以下输出。

输出 −

文档内容:

元数据该文件:

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 {

      //检测文件类型
      BodyContentHandler handler = new BodyContentHandler();
      Metadata metadata = new Metadata();
      FileInputStream inputstream = new FileInputStream(new File("example.mp4"));
      ParseContext pcontext = new ParseContext();
      
      //Html解析器
      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 文件的属性快照。

Passing MP4

执行上述程序后,您将获得以下输出 −

输出

文档内容:

文档的元数据:

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 {

      //检测文件类型
      BodyContentHandler handler = new BodyContentHandler();
      Metadata metadata = new Metadata();
      FileInputStream inputstream = new FileInputStream(new File("example.mp3"));
      ParseContext pcontext = new ParseContext();
      
      //Mp3解析器
      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 文件具有以下属性 −

Example MP3

执行程序后,您将获得以下输出。如果给定的文件有任何歌词,我们的应用程序将捕获并与输出一起显示。

输出

文档内容:

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

文档的元数据:

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