1. Tika是什么
Tika是Lucene的一个子项目。
Tika是一个集合,用于处理各种格式化的文档,如doc(x), xls(x), ppt(x), jpg, pdf, etc. 它本身的core可以自动判别文件类型(AutoDetectParser类),也定义了统一的接口(the parse interface),外部接挂了各种处理不同格式文档的parser实现(implementation)。
2. Tika安装向导
使用了Maven2的编译生成的Tika,其源码可以在
http://lucene.apache.org/tika/下到。不过默认不提供生成的jar档案,需要自己用Maven2生成。因此如果读者没配置过Maven2,还需要首先去
http://maven.apache.org/download.html下载Maven2,笔者当前使用的是Maven2.2.1。
2.1 安装Maven2
在Windows下,解压获得的apache-maven-2.x.x-bin.zip至你想要安置Maven2的目录,比如笔者解压至了"D:\Library\",那么D:\Library\apache-maven-2.2.1是Maven2的根目录
去配置名为M2_HOME的环境变量为上述路径;如果是2.0.9版本则需注意路径最后一个字符不能是'\';继续配置名为M2的环境变量为"%M2_HOME%\bin";可选配置则是MAVEN_OPTS,可以把JVM的内存选项填上去:-Xms256m -Xmx512m。最后在Path系统环境变量中添加%M2%一项。
如果还没有装JDK,当然需要把JDK给装上,并且设置了JAVA_HOME环境变量和Path环境变量中包括的%JAVA_HOME%\bin。
经过上述步骤,在cmd中键入mvn --version看看是否正确输出。
UNIX-like系统可以参考下载页的installation instructions,过程都差不多。
2.2 生成Tika目标文件
把Tika解压到某特定目录,比如笔者的D:\Library则根目录是D:\Library\tika-0.5。cmd进入该目录,执行mvn clean install,经过耐心等待,就可以在tika-core目录下发现新增了一个target目录,该目录下有一个jar文件tika-core-0.5.jar,这就是我们要的了。不过我们并未同时发现tika-app和tika-parsers下的对应jar,不过没关系,依葫芦画瓢,进入该二目录,各自执行mvn install,就可以得到各自的jar档案,分别是tika-app-0.5.jar和tika-parsers-0.5.jar。
上述三个jar文件,tika-core-0.5.jar(
附件下载)是tika的核心和接口,不包括parser实现,后者包含在tika-parsers-0.5.jar(
附件下载)中,各类文档的解析类,实现了core中定义的接口。至于tika-app-0.5.jar,则是可执行的jar。下文将给出使用方法。
3. 初步使用
无疑,作为一个程序(命令行)来使用是最直接最简单的。进入app的jar所在的目录,运行java -jar tika-app-0.5.jar -?看看都有哪些用法吧,这里就不全部介绍了。比如笔者随意拿了一个xls文档,运行java -jar tika-app-0.5.jar -t test.xls,就可以看到xls里的文本内容了,还是以类似表格方式列印在控制台的,中文也没有问题。
4. 程序调用
主要的接口类就是
org.apache.tika.parser.Parser的
void parse(InputStream stream, ContentHandler handler, Metadata metadata)throws IOException, SAXException, TikaException;
parser接受一个流作为文档输入,一个org.xml.sax.ContentHandler作为内容格式输出。parser默认使用XHTMLContentHandler来产生XHTML输出。但通常需要指定一个ContentHandler来生成所需要的输出。Tika已经为我们实现了一些ContentHandler类,比如BodyContentHandler用来提取XHTML输出的body部分,以填入SAX事件供另外的ContentHandler处理,或者给出提取字符至输出流、writer或字符串。
ContentHandler handler = new BodyContentHandler(System.out);
parser.parse(System.in, handler, ...);
以上片段使用系统标准输入作为文档,把提取的文本内容发至标准输出。
另一个有用的方式是使用ParsingReader,解析文档,返回文本内容的字符流:
InputStream stream = ...; // the document to be parsed
Reader reader = new ParsingReader(parser, stream, ...);
try {
...; // read the document text using the reader
} finally {
reader.close(); // the document stream is closed automatically
}
值得注意的是,maven生成的tika的jar包是有依赖于几个其他的包的,包括dom4j, xbeans, apache-poi, PDFBox等。在建立工程的时候需要引入相关的jar。
最后附一个可运行的简单Demo:
public class TikaDemo {
public static String PATH = "E:\\0104-0110工作计划.docx";
public static String OUTPATH = PATH+".OUT";
/**
* @param args
* @throws TikaException
* @throws SAXException
* @throws IOException
*/
public static void main(String[] args) throws IOException, SAXException, TikaException {
Parser parser = new OOXMLParser();
InputStream iStream = new BufferedInputStream(new FileInputStream(new File(PATH)));
OutputStream oStream = new BufferedOutputStream(new FileOutputStream(new File(OUTPATH)));
ContentHandler iHandler = new BodyContentHandler(oStream);
parser.parse(iStream, iHandler, new Metadata(), new ParseContext());
}
}