Apache Tika(文本分析工具包)能够检测并提取
来自上千种不同文件类型(如PPT、XLS和PDF)的元数据和文本;所有这些文件类型都可以通过一个接口进行解析,这使得Tika在搜索引擎索引、内容分析、翻译等方面非常有用。
介绍下Tika在Maven项目中的使用,首先介绍下Tika相关的两个Maven依赖:
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>1.26</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
<version>1.26</version>
</dependency>
tika-core
:包含Tika的关键接口和类,如果不需要来自Tika解析器组件的完整解析器集,可以单独使用。
tika-parsers
:如果您想使用Tika来解析文档(而不是简单地检测文档类型等等),需要引入该依赖。
Parser是tika的核心概念,它隐藏了不同文件格式和解析库的复杂性,为客户端程序提供了一个简单而强大的机制,用来从各种各样的文档中提取元数据和结构化文本内容,所有文档的解析使用一个接口来实现:
/**
*@param stream 所要解析文档的输入流
*@param handler 内容处理器,用来收集结果,Tika会将解析结果包装成XHTML SAX event进行分发,通过ContentHandler处理这些event就可以得到文本内容和其他有用的信息
*@param metadata 用于向解析器内外传递文档元数据。
*@param context 解析上下文有两个功能
* 1)向解析过程注入特定上下文,例如:在Microsoft Excel电子表格中处理特定地区的日期和数字格式
* 2)将委托解析器实例传递给两阶段解析器(如PackageParser子类)使用
**/
void parse(InputStream stream, ContentHandler handler, Metadata metadata,
ParseContext context) throws IOException, SAXException, TikaException;
在所有的解析器类中有一个典型类:
AutoDetectParser
,将所有Tika功能封装到一个可以处理任何类型文档的解析器中;默认使用的就是该解析器。
在Tika工具包中,有一个与MIME-Types有关的配置文件:custom-mimetypes.xml 但是如果要对一个全新的MIME-Type文件进行解析,则可以自定义解析器,步骤如下:
org/apache/tika/mime/custom-mimetypes.xml
,文件格式如下,以application/hello
为例来介绍: <?xml version="1.0" encoding="UTF-8"?>
<mime-info>
<mime-type type="application/hello">
<glob pattern="*.hi"/>
</mime-type>
</mime-info>
AbstractParser
,一般建议继承抽象类,实现如下:public class HelloParser extends AbstractParser {
private static final Set<MediaType> SUPPORTED_TYPES = Collections.singleton(MediaType.application("hello"));
public static final String HELLO_MIME_TYPE = "application/hello";
public Set<MediaType> getSupportedTypes(ParseContext context) {
return SUPPORTED_TYPES;
}
public void parse(InputStream stream, ContentHandler handler,
Metadata metadata, ParseContext context)
throws IOException, SAXException, TikaException {
metadata.set(Metadata.CONTENT_TYPE, HELLO_MIME_TYPE);
metadata.set("Hello", "World");
XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
xhtml.startDocument();
xhtml.endDocument();
}
}
如果想要使用AutoDetectParser
类的功能时,可以将自定义的parser,添加到org.apache.tika.parser.Parser
文件中,在项目/src/main/resources
下添加META-INF/services/org.apache.tika.parser.Parser
文件,然后把自定义的parse包名配置上即可,可以参考:org.apache.tika.parser.Parser配置举例
检测器接口是是实现文本检测的基础,该接口的方法如下:
/**
*@param input 要检测文档的输入流
*@param metadata 文档元数据信息,该元数据信息通常需要包含两个关键值:
* 1)RESOURCE_NAME_KEY,它应该包含文件的名称(已知的),以及元数据;
* 2)CONTENT_TYPE,它应该包含该文件发布的内容类型(例如来自web服务器或内容存储库)。
**/
MediaType detect(java.io.InputStream input,Metadata metadata) throws java.io.IOException
Tika提供了一个特殊的检测器
org.apache.tika.detect.DefaultDetector
,它在运行时自动检测(基于服务文件)可用的检测器,并依次尝试这些检测器来识别文件类型;默认使用该注册器。
在使用时,可以使用Tika的配置xml文件实现Tika的配置,从而控制哪些类型的文件,使用哪些类型的解析器等等,具体的可配置项可以参考:Tika配置 ,这里举一个配置文件的例子:
<?xml version="1.0" encoding="UTF-8"?>
<properties>
<parsers>
<!-- Default Parser for most things, except for 2 mime types, and never
use the Executable Parser -->
<parser class="org.apache.tika.parser.DefaultParser">
<mime-exclude>image/jpeg</mime-exclude>
<mime-exclude>application/pdf</mime-exclude>
<parser-exclude class="org.apache.tika.parser.executable.ExecutableParser"/>
</parser>
<!-- Use a different parser for PDF -->
<parser class="org.apache.tika.parser.EmptyParser">
<mime>application/pdf</mime>
</parser>
</parsers>
</properties>
接下来使用配置文件:
TikaConfig config = new TikaConfig("/path/to/tika-config.xml");
Detector detector = config.getDetector();
Parser autoDetectParser = new AutoDetectParser(config);
关于Tika更多的使用,可以参考官网使用举例:Tika使用举例