转载专用:
读到了好文章,用于分享收藏,侵权删。
转发自大佬:zhao_pq,https://blog.csdn.net/weixin_42184707/article/details/91045592
最近在处理数据集成的一些东西,在非结构化文件的元数据集成这里需要引入一些工具,Tika很合适,来研究研究。
1、Tika应用层架构
应用程序员可以很容易地在他们的应用程序集成Tika。Tika还提供了一个命令行界面和图形用户界面,在日常用或者说试验功能时,就感觉很人性化。
Tika架构是有四个重要模块构成:
- 语言检测机制
- MIME检测机制
- Parser接口
- Tika Facade 类
1.1 语言检测机制
每当一个文本文件被传递到Tika,它将检测在其中的语言。它接受没有语言的注释文件和通过检测该语言添加在该文件的元数据信息。
支持语言识别,Tika 有一类叫做语言标识符在包org.apache.tika.language及语言识别资料库里面包含了语言检测从给定文本的算法。Tika 内部使用N-gram算法语言检测。
1.2 MIME检测机制
Tika可以根据MIME标准检测文档类型。Tika默认MIME类型检测是使用org.apache.tika.mime.mimeTypes。它使用org.apache.tika.detect.Detector接口大部分内容类型检测。
内部Tika使用多种技术,如文件匹配替换,内容类型提示,魔术字节,字符编码,以及其他一些技术。
1.3 解析器接口
org.apache.tika.parser解析器接口是Tika解析文档的主要接口。该接口从提取文档中的文本和元数据,并总结了其对外部用户愿意写解析器插件。
采用不同的具体解析器类,具体为各个文档类型,Tika 支持大量的文件格式。这些格式的具体类不同的文件格式提供支持,无论是通过直接实现逻辑分析器或使用外部解析器库。
1.4 Tika Facade 类
使用的Tika facade类是从Java调用Tika的最简单和直接的方式,而且也沿用了外观的设计模式。可以在 Tika API的org.apache.tika包Tika 找到外观facade类。
通过实现基本用例,Tika作为facade的代理。它抽象了的Tika库的底层复杂性,例如MIME检测机制,解析器接口和语言检测机制,并提供给用户一个简单的接口来使用。
2、Tika的特点
统一解析器接口:Tika封装在一个单一的解析器接口的第三方解析器库。由于这个特征,用户逸出从选择合适的解析器库的负担,并使用它,根据所遇到的文件类型。
低内存占用:Tika因此消耗更少的内存资源也很容易嵌入Java应用程序。也可以用Tika平台像移动那样PDA资源少,运行该应用程序。
快速处理:从应用连结内容检测和提取可以预期的。
灵活元数据:Tika理解所有这些都用来描述文件的元数据模型。
解析器集成:Tika可以使用可在单一应用程序中每个文件类型的各种解析器库。
MIME类型检测:Tika可以检测并从所有包括在MIME标准的媒体类型中提取内容。
语言检测:Tika包括语言识别功能,因此可以在一个多语种网站基于语言类型的文档中使用。
3、Tika的功能
Tika支持多种功能:
- 文档类型检测
- 内容提取
- 元数据提取
- 语言检测
了解到,新版本的Tika与其他库集成了更高级的功能,有:
- 计算机视觉Computer vision:例如生成图像说明;
- 机器学习(ML)Machine learning (ML):集成机器学习工具,如TensorFlow和Mahout;
- 自然语言处理(NLP)Natural language processing (NLP):自然语言处理工具集成,如OpenNLP和NLTK。
3.1 文件类型检测
Tika使用不同的检测技术,检测给它的文件的类型。
3.2 内容提取
Tika有一个解析器库,可以分析各种文档格式的内容,并提取它们。然后检测所述文档的类型,它从解析器库选择的适当的分析器,并传递该文档。不同类别的Tika方法来解析不同的文件格式。
3.3 元数据提取
随着内容,Tika提取具有相同的程序的文件的元数据中的内容的提取。对于某些文件类型,Tika有接口类提取元数据。
3.4 语言检测
在内部,Tika如下像一个n-gram算法来检测所述内容的语言的给定文档中。Tika取决于类,如语言识别和Profiler的语言识别。
4、Tika环境配置
4.1 系统要求
JDK | Java SE 2 JDK 1.6 及以上 |
内存 | 1 GB RAM (推荐) |
磁盘 | 无最小要求 |
OS | Windows XP 及以上,Linux |
Maven依赖
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
<version>1.17</version>
</dependency>
Tika图形操作界面
下载 tika-app-1.21.jar
下载地址:tika-app-2.9.2.jarhttps://mirrors.tuna.tsinghua.edu.cn/apache/tika/2.9.2/tika-app-2.9.2.jar
运行
运行 java -jar tika-app-2.9.2.jar ,如下图
在GUI上,点击open打开,浏览并选择一个文件,该文件将被提取,或将其拖动到窗口的空白。
Tika 提取的文件的内容,并在五个不同的格式显示出来,即。元数据、格式化文本、纯文本、主要内容、结构化文本和JSON格式。
5、Tika支持的文件格式
下面的表显示了Tika支持的文件格式。
文件格式 | 类库 | Tika中的类 |
XML | org.apache.tika.parser.xml | XMLParser |
HTML | org.apache.tika.parser.htmll and it uses Tagsoup Library | HtmlParser |
MS-Office compound document Ole2 till 2007 ooxml 2007 onwards | org.apache.tika.parser.microsoft org.apache.tika.parser.microsoft.ooxml and it uses Apache Poi library | OfficeParser(ole2) OOXMLParser(ooxml) |
OpenDocument Format openoffice | org.apache.tika.parser.odf | OpenOfficeParser |
portable Document Format(PDF) | org.apache.tika.parser.pdf and this package uses Apache PdfBox library | PDFParser |
Electronic Publication Format (digital books) | org.apache.tika.parser.epub | EpubParser |
Rich Text format | org.apache.tika.parser.rtf | RTFParser |
Compression and packaging formats | org.apache.tika.parser.pkg and this package uses Common compress library | PackageParser and CompressorParser and its sub-classes |
Text format | org.apache.tika.parser.txt | TXTParser |
Feed and syndication formats | org.apache.tika.parser.feed | FeedParser |
Audio formats | org.apache.tika.parser.audio and org.apache.tika.parser.mp3 | AudioParser MidiParser Mp3- for mp3parser |
Imageparsers | org.apache.tika.parser.jpeg | JpegParser-for jpeg images |
Videoformats | org.apache.tika.parser.mp4 and org.apache.tika.parser.video this parser internally uses Simple Algorithm to parse flash video formats | Mp4parser FlvParser |
java class files and jar files | org.apache.tika.parser.asm | ClassParser CompressorParser |
Mobxformat (email messages) | org.apache.tika.parser.mbox | MobXParser |
Cad formats | org.apache.tika.parser.dwg | DWGParser |
FontFormats | org.apache.tika.parser.font | TrueTypeParser |
executable programs and libraries | org.apache.tika.parser.executable | ExecutableParser |
6、java整合Tika实现文件解析
6.1 Tika文件类型检测
public static String getFileType(){
try {
File file = new File("D:\\111.zip");
Tika tika = new Tika();
String fileType = tika.detect(file);
if (fileType != null && fileType.contains("/")) {
fileType = fileType.substring(fileType.indexOf("/") +1);
}
return fileType;
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
6.2 Tika内容提取
public static String getContext(){
try {
File file = new File("sample.txt");
Tika tika = new Tika();
String filecontent = tika.parseToString(file);
System.out.println("Extracted Content: " + filecontent);
return filecontent;
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
6.3 Tika元数据提取
public static String parsePdf(){
try {
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
FileInputStream inputstream = new FileInputStream(new File("D:\\111.pdf"));
ParseContext pcontext = new ParseContext();
//parsing the document using PDF parser
PDFParser pdfparser = new PDFParser();
pdfparser.parse(inputstream, handler, metadata,pcontext);
//getting the content of the document
System.out.println("Contents of the PDF :" + handler.toString());
// 元数据提取
System.out.println("Metadata of the PDF:");
String[] metadataNames = metadata.names();
for(String name : metadataNames) {
System.out.println(name+ " : " + metadata.get(name));
}
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
6.4 Tika语言检测
public static String LanguageDetection() {
try {
Parser parser = new AutoDetectParser();
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
FileInputStream content = new FileInputStream(new File("D:\\111.zip"));
//Parsing the given document
parser.parse(content, handler, metadata, new ParseContext());
LanguageIdentifier object = new LanguageIdentifier(handler.toString());
System.out.println("Language name :" + object.getLanguage());
return object.getLanguage();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
6.5 Tika提取pdf文件
public static String parsePdf(){
try {
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
FileInputStream inputstream = new FileInputStream(new File("D:\\1111.pdf"));
ParseContext pcontext = new ParseContext();
//parsing the document using PDF parser
PDFParser pdfparser = new PDFParser();
pdfparser.parse(inputstream, handler, metadata,pcontext);
//getting the content of the document
System.out.println("Contents of the PDF :" + handler.toString());
// 元数据提取
System.out.println("Metadata of the PDF:");
String[] metadataNames = metadata.names();
for(String name : metadataNames) {
System.out.println(name+ " : " + metadata.get(name));
}
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
6.6 Tika提取文本文档
public static String parseTxt(){
try {
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
FileInputStream inputstream = new FileInputStream(new File("D:\\example.txt"));
ParseContext pcontext=new ParseContext();
//Text document parser
TXTParser TexTParser = new TXTParser();
TexTParser.parse(inputstream, handler, metadata,pcontext);
System.out.println("Contents of the document:" + handler.toString());
return handler.toString();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
6.7 Tika提取excel内容
public static String parseExcel(){
try {
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
FileInputStream inputstream = new FileInputStream(new File("D:\\111.xlsx"));
ParseContext pcontext=new ParseContext();
OOXMLParser msofficeparser = new OOXMLParser ();
msofficeparser.parse(inputstream, handler, metadata,pcontext);
System.out.println("Contents of the document:" + handler.toString());
return handler.toString();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
6.8 Tika提取word内容
Tika-1.*最高支持2007及更低版本的Office Word文档,如果是高于2007版本的Word文档需要使用POI处理(Tika会报错)。
public static String readWord(InputStream is ,boolean doc) {
String buffer = "";
try {
if (doc) {
//根据文件后缀进判断分支,.doc和.docx使用的方法不一样
BodyContentHandler handler = new BodyContentHandler(1024 * 1024 * 10);//设置文档大小,避免文件太大Tika报错,默认大小就是1024*1024*10
Metadata metadata = new Metadata();
ParseContext pContext = new ParseContext();
Parser msOfficeParser = new OfficeParser();
msOfficeParser.parse(is , handler , metadata , pContext);
buffer = handler.toString();
is.close();
} else {
Tika tika = new Tika();
buffer = tika.parseToString(is);
is.close();
}
} catch (Exception e) {
throw new RRException("读取文件失败,请用Microsoft Word另存为之后再上传");
}
return buffer;
}