Tika是一个内容抽取的工具集合(a toolkit for text extracting)。它集成了POI, Pdfbox 并且为文本抽取工作提供了一个统一的界面。其次,Tika也提供了便利的扩展API,用来丰富其对第三方文件格式的支持。
PDF - 通过Pdfbox
MS-* - 通过POI
HTML - 使用nekohtml将不规范的html整理成为xhtml
OpenOffice 格式 - Tika提供
Archive - zip, tar, gzip, bzip等
RTF - Tika提供
Java class - Class解析由ASM完成
Image - 只支持图像的元数据抽取
--引用多个jar
package com.techrefine.base.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
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;
/**
*
* @Description: 文本抽取工具类
* 目前测试支持格式 .docx .pdf .txt .html .xlsx .pptx .ppt 其他无测试
* @Company:TGRF
* @author: lijianjun
*
* @date: 2014-7-2 下午4:29:30
* @version V1.0
*/
public class TiKaUtil {
/**
*
* @method: getBody
* @Description: 传入文件路径返回文件文本内容
*
* @param file
* @return
* @throws Exception
*
* @author: lijianjun
* @date 2014-7-2 下午4:30:46
* @return String 如果文件为空或者不存在将返回null
*/
public static String getBody(File file) throws Exception {
if(file==null||!file.exists()){
return null;
}
//XHTML SAX事件处理器。将输入文档的结构化信息以XHTML格式写入到此Handler。
ContentHandler handler = null;
try {
//不确定文档格式
Parser parser = new AutoDetectParser();
//文档输入原始 字节流。
InputStream input = new FileInputStream(file);
//文档元数据。既是输入参数,也是输出参数。作输入参数时,能够有助于解析器更好地理解文档的格式。
Metadata meta = new Metadata();
handler = new BodyContentHandler();
parser.parse(input, handler, meta, new ParseContext());
} catch (Exception e) {
e.printStackTrace();
}
return handler.toString();
}
}
引用一个Tike-app-1.5.jar
import org.apache.tika.Tika;
public class TikaTest {
public static void main(String[] args) throws Exception {
// 创建 Tika实例
Tika tika = new Tika();
// 使用tika对文件内容进行抽取,对常用的文档格式进行测试
// String filePath="D:/tikatest/test.pdf";
// String filePath="D:/tikatest/test.doc";
// String filePath="D:/tikatest/test.docx";
// String filePath="D:/tikatest/test.txt";
// String filePath="D:/tikatest/test.ppt";
// String filePath="D:/tikatest/test.wps";
String filePath = "D:/tikatest/test.zip";
//此处限制读取文本内容长度
tika.setMaxStringLength(1000);
String text = tika.parseToString(new File(filePath));
System.out.println(text);
}
}
文档
http://blog.csdn.net/gezhonglei2007/article/details/8078104
1. Tika类
(1)tika类的基本用法
detect:获取文档格式String
detect(File | String | URL | InputStream)
parse:获取Reader(Lucene的Field取值的参数,提供Reader是用于解决字符串过大的问题)
parse(File | String | URL | InputStream);
parse(InputStream inputStream, Metadata metadata);
parseToString:获取全文String(setMaxStringLength(int)是对此方法获取全文长度的限制)
parseToString(File | URL | InputStream);
parseToString(InputStream, Metadata metadata);
(2)Tika的构成
Parser:AutoDetectorParser,是一个Parser的组合(CompositeParser)。ParserContext只在Parser.parser()处使用。
Detector:DefaultDetector,是一个Detector的组合(CompositeDetector)。
(3)TikaConfig
CompositeParser:
Detector:DefaultDetector(也是CompositeDector的子类)或CompositeDetector
MimeTypes:可以获取所需的Mime类型
2. 文件格式诊断
只有确定了文件格式,才能找到正确的工具读取文件的内容。文件格式表示的方式是以Media type(MIME)。
(1)判断文件格式的方式:
Filename:从文件名的文件扩展名中获取文件格式。一般不可信,它可以被任意改动;或者,根本就没有扩展名。
Content type:某些与文档相关的外部信息,如HTML的请求头信息。但此方式做为文件格式的判断方式同filename一样,仍然没有保证。
Magic bytes:文件内部某些特征字符。除了找到文件格式外,还需要找到charcter encoding。
(2)判断character encoding方式:
BOM(byte order mark)标记:文档最前面的几个标识字节。
字节频率:也可用于判断文件名。从文档的前几kb中查看不同字节的出现频率。
统计:最终的办法(迫不得已的办法)。
还有其它一些与文件格式的相应特征,可以用于判断。像xml,ole等格式。
综合试探法:将前面提到的各种方法进行判断。
3. Parser接口
void parse(InputStream stream, ContentHandler handler,Metadata metadata, ParseContext context)throws IOException, SAXException, TikaException;
InputStream:文档输入原始 字节流。它不会在此方法中关闭InputStream。
ParserContext: 解析处理的上下文。此参数用于用户需要定制解析过程时使用。如何控制?它内部一个Map,用Map保存接口(class)与其实例的所组成的键值对。这些接口(class)只能是在Parser中用于解析文档的所需接口才会起作用。
ContentHandler:XHTML SAX事件处理器。将输入文档的结构化信息以XHTML格式写入到此Handler。
Metadata:文档元数据。既是输入参数,也是输出参数。作输入参数时,能够有助于解析器更好地理解文档的格式。
4. 选择解析器Parser
(1)确定只用一种文档格式(以Html格式为例)
Parser parser = new HtmlParser();
parser.parse(stream, handler, metadata, context);
(2)确定使用多种文档格式中的某一格式
Map<MediaType, Parser> parsersByType = new HashMap<MediaType, Parser>();
parsersByType.put(MediaType.parse("text/html"), new HtmlParser());
parsersByType.put(MediaType.parse("application/xml"), new XMLParser());
CompositeParser parser = new CompositeParser(); //Parser的集合
parser.setParsers(parsersByType);
parser.setFallback(new TXTParser());
Metadata metadata = new Metadata();
metadata.set(Metadata.CONTENT_TYPE, "text/html");
parser.parse(stream, handler, metadata, context);
(3)不确定文档格式
Parser parser = new AutoDetectParser();
parser.parse(stream, handler, metadata, context);
5. URL、File=>InputStream
(1)File-->InputStream
InputStream stream = new FileInputStream(new File(filename));
(2)Url --> InputStream
InputStream stream = new GZIPInputStream(new URL(address).openStream());
(3)File --> Url (在此主题中,一般不用)
URL uri = new File(filename).toURI().toURL();
(4)TikaInputStream——用于简化不同格式使用的多种嵌套流。
获取TikaInputStream:重载的get方法
[static] get(InputStream) //一般用于parser内部,将标准的InputStream转换成TikaInputStream。
[static] get(byte[], Metadata?)
[static] get(File, Metadata?)
[static] get(URI, Metadata?)
[static] get(URL, Metadata?)
[static] get(Blob, Metadata?)
6. Tika的语言诊断方法
tika的语言诊断方法,不支持中文。它是以不同拉丁语言中字母出现频率的差异来判断。所以,当你的样本中的文字太小,语言判断失误率超高。
7. ContentHandler
(1)默认使用BodyContentHandler。
(2)常用的Contenthandler:
BodyContentHandler:用于处理XHTML输出内容的<body>部分,将它写入Writer、
OutputStream、Buffer中,并将它重定向其它ContentHandler。
LinkContentHandler:处理XHTML输出的所有<a href="……">
TeeContentHandler:能用于多个工具并行处理parser的输出。
ProfilingHandler:用于语言的诊断。
[例如]
LinkContentHandler linkCollector = new LinkContentHandler();
OutputStream output = new FileOutputStream(new File(filename));
ContentHandler handler = new TeeContentHandler(new BodyContentHandler(output),
linkCollector); //linkCollector用来收集文档中所有的链接,可用于爬虫。
parser.parse(stream, handler, metadata, context);
8. 元数据的获取
(1)元数据是的有用的文档内容总结信息。元数据标准分为两种:一般元数据标准(general metadata standars)和特定内容元数据标准(content-special metadata standars)。
(2)general metadata适用于所有已知的文件类型。
(3)content-special metadata标准是通过与特定的文件类型相关的属性、关系定义的。
(4)Metadata是多种元数据接口的实现类,以静态成员变量的形式包含以上所有元数据标准的属性名。即使用户没有填写元数据,某些文档也会存储其默认的元数据;但实际上我们需要是用户键入的元信息,而不需要这些无意义的默认值。因此,Parser在解析文档获取Metadata时,已经做了相应的处理,不保留这些默认信息的元数据,而只存用户键入的元数据信息。
9.另外:
(1)Tika可以读取出java编译后的class文件的内容,但是内容与原Java文件有差别,如方法只有声明没有实现、没有import语句,格式化后用专门的方法static void <clinit>()作为静态初始化……等。
(2)Tika读取的jar文件,读取class文件,某些内容出来时是乱码(问号)。
官方:http://tika.apache.org/0.8/api/index.html?org/
PDF - 通过Pdfbox
MS-* - 通过POI
HTML - 使用nekohtml将不规范的html整理成为xhtml
OpenOffice 格式 - Tika提供
Archive - zip, tar, gzip, bzip等
RTF - Tika提供
Java class - Class解析由ASM完成
Image - 只支持图像的元数据抽取
--引用多个jar
package com.techrefine.base.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
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;
/**
*
* @Description: 文本抽取工具类
* 目前测试支持格式 .docx .pdf .txt .html .xlsx .pptx .ppt 其他无测试
* @Company:TGRF
* @author: lijianjun
*
* @date: 2014-7-2 下午4:29:30
* @version V1.0
*/
public class TiKaUtil {
/**
*
* @method: getBody
* @Description: 传入文件路径返回文件文本内容
*
* @param file
* @return
* @throws Exception
*
* @author: lijianjun
* @date 2014-7-2 下午4:30:46
* @return String 如果文件为空或者不存在将返回null
*/
public static String getBody(File file) throws Exception {
if(file==null||!file.exists()){
return null;
}
//XHTML SAX事件处理器。将输入文档的结构化信息以XHTML格式写入到此Handler。
ContentHandler handler = null;
try {
//不确定文档格式
Parser parser = new AutoDetectParser();
//文档输入原始 字节流。
InputStream input = new FileInputStream(file);
//文档元数据。既是输入参数,也是输出参数。作输入参数时,能够有助于解析器更好地理解文档的格式。
Metadata meta = new Metadata();
handler = new BodyContentHandler();
parser.parse(input, handler, meta, new ParseContext());
} catch (Exception e) {
e.printStackTrace();
}
return handler.toString();
}
}
引用一个Tike-app-1.5.jar
import org.apache.tika.Tika;
public class TikaTest {
public static void main(String[] args) throws Exception {
// 创建 Tika实例
Tika tika = new Tika();
// 使用tika对文件内容进行抽取,对常用的文档格式进行测试
// String filePath="D:/tikatest/test.pdf";
// String filePath="D:/tikatest/test.doc";
// String filePath="D:/tikatest/test.docx";
// String filePath="D:/tikatest/test.txt";
// String filePath="D:/tikatest/test.ppt";
// String filePath="D:/tikatest/test.wps";
String filePath = "D:/tikatest/test.zip";
//此处限制读取文本内容长度
tika.setMaxStringLength(1000);
String text = tika.parseToString(new File(filePath));
System.out.println(text);
}
}
文档
http://blog.csdn.net/gezhonglei2007/article/details/8078104
1. Tika类
(1)tika类的基本用法
detect:获取文档格式String
detect(File | String | URL | InputStream)
parse:获取Reader(Lucene的Field取值的参数,提供Reader是用于解决字符串过大的问题)
parse(File | String | URL | InputStream);
parse(InputStream inputStream, Metadata metadata);
parseToString:获取全文String(setMaxStringLength(int)是对此方法获取全文长度的限制)
parseToString(File | URL | InputStream);
parseToString(InputStream, Metadata metadata);
(2)Tika的构成
Parser:AutoDetectorParser,是一个Parser的组合(CompositeParser)。ParserContext只在Parser.parser()处使用。
Detector:DefaultDetector,是一个Detector的组合(CompositeDetector)。
(3)TikaConfig
CompositeParser:
Detector:DefaultDetector(也是CompositeDector的子类)或CompositeDetector
MimeTypes:可以获取所需的Mime类型
2. 文件格式诊断
只有确定了文件格式,才能找到正确的工具读取文件的内容。文件格式表示的方式是以Media type(MIME)。
(1)判断文件格式的方式:
Filename:从文件名的文件扩展名中获取文件格式。一般不可信,它可以被任意改动;或者,根本就没有扩展名。
Content type:某些与文档相关的外部信息,如HTML的请求头信息。但此方式做为文件格式的判断方式同filename一样,仍然没有保证。
Magic bytes:文件内部某些特征字符。除了找到文件格式外,还需要找到charcter encoding。
(2)判断character encoding方式:
BOM(byte order mark)标记:文档最前面的几个标识字节。
字节频率:也可用于判断文件名。从文档的前几kb中查看不同字节的出现频率。
统计:最终的办法(迫不得已的办法)。
还有其它一些与文件格式的相应特征,可以用于判断。像xml,ole等格式。
综合试探法:将前面提到的各种方法进行判断。
3. Parser接口
void parse(InputStream stream, ContentHandler handler,Metadata metadata, ParseContext context)throws IOException, SAXException, TikaException;
InputStream:文档输入原始 字节流。它不会在此方法中关闭InputStream。
ParserContext: 解析处理的上下文。此参数用于用户需要定制解析过程时使用。如何控制?它内部一个Map,用Map保存接口(class)与其实例的所组成的键值对。这些接口(class)只能是在Parser中用于解析文档的所需接口才会起作用。
ContentHandler:XHTML SAX事件处理器。将输入文档的结构化信息以XHTML格式写入到此Handler。
Metadata:文档元数据。既是输入参数,也是输出参数。作输入参数时,能够有助于解析器更好地理解文档的格式。
4. 选择解析器Parser
(1)确定只用一种文档格式(以Html格式为例)
Parser parser = new HtmlParser();
parser.parse(stream, handler, metadata, context);
(2)确定使用多种文档格式中的某一格式
Map<MediaType, Parser> parsersByType = new HashMap<MediaType, Parser>();
parsersByType.put(MediaType.parse("text/html"), new HtmlParser());
parsersByType.put(MediaType.parse("application/xml"), new XMLParser());
CompositeParser parser = new CompositeParser(); //Parser的集合
parser.setParsers(parsersByType);
parser.setFallback(new TXTParser());
Metadata metadata = new Metadata();
metadata.set(Metadata.CONTENT_TYPE, "text/html");
parser.parse(stream, handler, metadata, context);
(3)不确定文档格式
Parser parser = new AutoDetectParser();
parser.parse(stream, handler, metadata, context);
5. URL、File=>InputStream
(1)File-->InputStream
InputStream stream = new FileInputStream(new File(filename));
(2)Url --> InputStream
InputStream stream = new GZIPInputStream(new URL(address).openStream());
(3)File --> Url (在此主题中,一般不用)
URL uri = new File(filename).toURI().toURL();
(4)TikaInputStream——用于简化不同格式使用的多种嵌套流。
获取TikaInputStream:重载的get方法
[static] get(InputStream) //一般用于parser内部,将标准的InputStream转换成TikaInputStream。
[static] get(byte[], Metadata?)
[static] get(File, Metadata?)
[static] get(URI, Metadata?)
[static] get(URL, Metadata?)
[static] get(Blob, Metadata?)
6. Tika的语言诊断方法
tika的语言诊断方法,不支持中文。它是以不同拉丁语言中字母出现频率的差异来判断。所以,当你的样本中的文字太小,语言判断失误率超高。
7. ContentHandler
(1)默认使用BodyContentHandler。
(2)常用的Contenthandler:
BodyContentHandler:用于处理XHTML输出内容的<body>部分,将它写入Writer、
OutputStream、Buffer中,并将它重定向其它ContentHandler。
LinkContentHandler:处理XHTML输出的所有<a href="……">
TeeContentHandler:能用于多个工具并行处理parser的输出。
ProfilingHandler:用于语言的诊断。
[例如]
LinkContentHandler linkCollector = new LinkContentHandler();
OutputStream output = new FileOutputStream(new File(filename));
ContentHandler handler = new TeeContentHandler(new BodyContentHandler(output),
linkCollector); //linkCollector用来收集文档中所有的链接,可用于爬虫。
parser.parse(stream, handler, metadata, context);
8. 元数据的获取
(1)元数据是的有用的文档内容总结信息。元数据标准分为两种:一般元数据标准(general metadata standars)和特定内容元数据标准(content-special metadata standars)。
(2)general metadata适用于所有已知的文件类型。
(3)content-special metadata标准是通过与特定的文件类型相关的属性、关系定义的。
(4)Metadata是多种元数据接口的实现类,以静态成员变量的形式包含以上所有元数据标准的属性名。即使用户没有填写元数据,某些文档也会存储其默认的元数据;但实际上我们需要是用户键入的元信息,而不需要这些无意义的默认值。因此,Parser在解析文档获取Metadata时,已经做了相应的处理,不保留这些默认信息的元数据,而只存用户键入的元数据信息。
9.另外:
(1)Tika可以读取出java编译后的class文件的内容,但是内容与原Java文件有差别,如方法只有声明没有实现、没有import语句,格式化后用专门的方法static void <clinit>()作为静态初始化……等。
(2)Tika读取的jar文件,读取class文件,某些内容出来时是乱码(问号)。
官方:http://tika.apache.org/0.8/api/index.html?org/