首页 > 代码库 > Apache Tika-内容解析提取工具集合(a content analysis toolkit)

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