Apache Tika-内容解析提取工具集合(a content analysis toolkit)

简介:

简介

      Apache Tika toolkit可以自动检测各种文档(如word,ppt,xml,csv,ppt等)的类型并抽取文档的元数据和文本内容。Tika集成了现有的文档解析库,并提供统一的接口,使针对不同类型的文档进行解析变得更简单。Tika针对搜索引擎索引、内容分析、转化等非常有用。

支持的文档格式

    详见参见http://tika.apache.org/1.5/formats.html

  1. HyperText Markup Language
  2. XML and derived formats
  3. Microsoft Office document formats
  4. OpenDocument Format
  5. Portable Document Format
  6. Electronic Publication Format
  7. Rich Text Format
  8. Compression and packaging formats
  9. Text formats
  10. Feed and Syndication formats
  11. Audio formats
  12. Image formats
  13. Video formats
  14. Java class files and archives
  15. The mbox format
  16. CAD formats
  17. Font formats
  18. Executable programs and libraries

处理过程

    Tika通过一个parser和一个contentHandler来进行文档分析和处理,其中parser负责解析具体的文档,当解析到需要进行处理的时候,调用contentHandler进行解析内容的处理。contentHandler(org.xml.sax)是一个用于处理sax解析的程序接口,当parser解析到某些内容时(如节点之间的信息,以及节点本身的信息)时,便会根据需要去调用contentHandler的相关处理方法。即一个负责解析,一个负责处理,两者相互协作,最终将信息通过一定的手段返回回来

     Parser是一个接口,对不同的文档进行处理时,需要寻找具体的解析器来实现具体的解析工作。Tika通过MimeType来实现对一个文档的具体识别工作,即识别出一个文档是什么样的类型,然后再根据类型寻找相应的parser。最后调用具体实现的parser来完成parse工作。

    ContentHandler也是一个接口,对不同的信息进行处理时,需要自己调用具体的信息处理类。一般来说,如果只关心文档内的内容(即有信息的地方),可以使用WriteOutContentHandler。这个handler将所以被解析到的信息通过一个output或write输出到调用者提供的输出流中,这样最终可以读取这个writer中的数据。

     除这些信息之外,还有一些信息需要在处理的过程中被解析和保存,比如一个文档的标题,作者以及contentType等。在tika中,这些信息被保存在一个叫Metadata的对象中。metadata保存了很多与具体文档相关的值,它以一个map的形式,保存相应的元数据信息值。如对于word,它会保存其中的Author,Keywords这些信息。这些信息对于用一些关键信息进行文档检索非常有用。

主要接口

    org.apache.tika.parser.Parser

/*
	 * 
	 * 解析一个文件流成一个序列的XHTML SAX事件
	 * 
	 * 在指定的metadata对象中填充文档相关的元数据信息
	 * 
	 * 解析后不会关闭文档流,关闭文档流由调用者负责
	 * 
	 * @param stream the document stream (input)
     * @param handler handler for the XHTML SAX events (output)
     * @param metadata document metadata (input and output)
     * @param context parse context
     * @throws IOException if the document stream could not be read
     * @throws SAXException if the SAX events could not be processed
     * @throws TikaException if the document could not be parsed
     */
    void parse(
            InputStream stream, ContentHandler handler,
            Metadata metadata, ParseContext context)
            throws IOException, SAXException, TikaException;

    org.xml.sax.ContentHandler

    这是大多数SAX应用程序要实现的接口。

    如果应用程序需要得到基本分析事件的通知,它需要实现这个接口,并用SAX parser注册一个实例。
解析器使用这个实例报告文档相关的事件如element的start,end

代码示例

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

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.ContentHandler;
import org.xml.sax.SAXException;

public class WordParserDemo {
	public static final String INPATH = "E:/test.xlsx";
	public static final String OUTPATH = "data.txt";

	public static void main(String[] args) throws IOException, SAXException,
			TikaException {
		// 针对97-2003的microsoft office使用
		// Parser parser = new OfficeParser();
		// 针对microsoft office 2007及其以后的版本,使用
		// Parser parser = new OOXMLParser();
		// 或简单的使用AutoDetectParser
		parseFile(INPATH, OUTPATH);
	}

	public static boolean parseFile(String inFile, String outFile) {
		boolean result = false;
		InputStream in = null;
		OutputStream out = null;
		try {
			//创建输入、输出流
			in = new BufferedInputStream(new FileInputStream(new File(inFile)));
			out = new BufferedOutputStream(new FileOutputStream(
					new File(outFile)));

			// 设置metadata
			Metadata meta = new Metadata();
			meta.add(Metadata.CONTENT_ENCODING, "utf-8");
			meta.set(Metadata.RESOURCE_NAME_KEY, inFile);

			// 设置contentHandler (可以替换为WriteOutContentHandler)
			ContentHandler handler = new BodyContentHandler(out);

			// 创建parser
			Parser parser = new AutoDetectParser();

			// 解析文档
			parser.parse(in, handler, meta, new ParseContext());

			// 打印metadata信息
			for (String name : meta.names()) {
				System.out.println(name + ":" + meta.get(name));
			}
		} catch (Exception e) {
			result = false;
			System.out.println(e.getMessage());
		} finally {
			try {
				if (in != null)
					in.close();
				if(out != null)
					out.close();
			} catch (IOException e1) {
				System.out.println(e1.getMessage());
			}
		}
		return result;
	}
}

参考

pache.org/1.5/formats.html

http://blog.csdn.net/an74520/article/details/20380739

目录
相关文章
|
8天前
|
SQL 分布式计算 监控
Sqoop数据迁移工具使用与优化技巧:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入解析Sqoop的使用、优化及面试策略。内容涵盖Sqoop基础,包括安装配置、命令行操作、与Hadoop生态集成和连接器配置。讨论数据迁移优化技巧,如数据切分、压缩编码、转换过滤及性能监控。此外,还涉及面试中对Sqoop与其他ETL工具的对比、实际项目挑战及未来发展趋势的讨论。通过代码示例展示了从MySQL到HDFS的数据迁移。本文旨在帮助读者在面试中展现Sqoop技术实力。
22 2
|
20天前
|
数据可视化 搜索推荐 BI
深度解析好用项目管理工具的功能优势
在选择项目管理工具时,重点在于全面的功能和高性价比。好工具应具备资源利用图(避免过度分配或闲置资源),团队协作功能(促进沟通与进度追踪),质量管理(如问题跟踪和自定义工作流),项目规划和跟踪(甘特图支持),任务管理(任务分解和依赖关系),以及费用跟踪。Zoho Projects、Microsoft Project、Jira等工具各有价格差异,例如,对于50个用户,Microsoft Project最贵,Zoho Projects最实惠,性价比高,适合中小企业。
28 2
|
29天前
|
Shell Linux 开发工具
【Shell 命令集合 文件管理】Linux 高级的文件管理器 mc 命令解析
【Shell 命令集合 文件管理】Linux 高级的文件管理器 mc 命令解析
38 0
|
1月前
|
JSON 数据格式
第三方系统或者工具通过 HTTP 请求发送给 ABAP 系统的数据,应该如何解析试读版
第三方系统或者工具通过 HTTP 请求发送给 ABAP 系统的数据,应该如何解析试读版
26 0
|
3月前
|
SQL Java 数据库
深入解析MyBatis-Plus中静态工具Db的多种用法及示例
深入解析MyBatis-Plus中静态工具Db的多种用法及示例
103 0
|
3月前
|
网络协议 安全
DNS查询工具 - dig
【1月更文挑战第4天】
83 0
|
3月前
|
网络协议
DNS查询工具 - nslookup
【1月更文挑战第5天】
137 1
|
26天前
|
运维 Linux Apache
LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
197 2
|
28天前
|
Shell Linux 网络安全
【Shell 命令集合 网络通讯 】Linux 管理Apache HTTP服务器 httpd命令 使用指南
【Shell 命令集合 网络通讯 】Linux 管理Apache HTTP服务器 httpd命令 使用指南
29 0
|
28天前
|
Shell Linux Apache
【Shell 命令集合 网络通讯 】Linux 管理Apache HTTP服务器 apachectl命令 使用教程
【Shell 命令集合 网络通讯 】Linux 管理Apache HTTP服务器 apachectl命令 使用教程
157 1

推荐镜像

更多