当前位置: 首页 > 工具软件 > Apache Tika > 使用案例 >

Apache Tika入门

燕智
2023-12-01

1、基本介绍

Apache Tika(文本分析工具包)能够检测并提取来自上千种不同文件类型(如PPT、XLS和PDF)的元数据和文本;所有这些文件类型都可以通过一个接口进行解析,这使得Tika在搜索引擎索引、内容分析、翻译等方面非常有用。

2、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来解析文档(而不是简单地检测文档类型等等),需要引入该依赖。

2.1、解析器接口(The Parser interface)

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功能封装到一个可以处理任何类型文档的解析器中;默认使用的就是该解析器。

2.1.1、自定义Parser类

在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>
  • 定义一个解析器类,该类可以实现Parser接口,也可以去继承抽象类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配置举例

2.2、检测器接口

检测器接口是是实现文本检测的基础,该接口的方法如下:

/**
*@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,它在运行时自动检测(基于服务文件)可用的检测器,并依次尝试这些检测器来识别文件类型;默认使用该注册器。

2.3、Tika配置

在使用时,可以使用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使用举例

 类似资料: