1. 程式人生 > >【Tika基礎教程之一】Tika基礎教程

【Tika基礎教程之一】Tika基礎教程

一、快速入門

1、Tika是一個用於文字解釋的框架,其本身並不提供任何的庫用於解釋文字,而是呼叫各種各樣的庫,如POI,PDFBox等。

使用Tika,可以提取檔案中的作者、標題、建立時間、正文等內容,相比於java.io自帶的一些功能(如FileInputStream,FIleReader,Scanner等):

(1)若文件為純文字,如txt,html,java檔案等,則二者對於檔案內容的提取基本無差別,都可將內容呈現出來。

(2)若文件為富文字,如office,pdf等,使用java.io直接讀取內容會得到一串亂碼,而需要通過種種工具去提取正文內容,如PDFBox提取PDF檔案,POI提取office檔案等。

TIka已將各種工具作了統一封裝,形成統一的API,用於提取文字正文。

但注意:解釋文字

上述步驟只是將正文內容提取了出來,如將word文件、Html文件等的正文提取出來,但未對文件正文的內容進行解釋,此時需要用到其它的工具如:

(1)DOM4J用於提取XML正文中的內容,如某個元素或者屬性的值。

(2)HtmlPaser用於提取HTML正文中的內容,也是提取無素或者屬性的值,比如提取文中的超連結等。

Tika是否已經完成此功能的封裝還不確認,以後再研究。

2、使用GUI介面解釋文字

(1)進入Tika所有的目錄,執行以下命令:

java -jar "tika-app-1.5 (1).jar" -g


(2)Tika的圖形介面被開啟,然後找開File-openURL:


(3)點選確認後,即返回解釋結果

預設情況下顯示的是文字的元資訊


(4)可以通過view選單中的選項,分別檢視 metadata, formatted text, plain text, main content, stuctured text等資訊。


3、呼叫API解釋檔案

package com.ljh.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

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 TikaBasicUtil {
	
	public String fileToTxt(File f) {
		//1、建立一個parser
		Parser parser = new AutoDetectParser();
		InputStream is = null;
		try {
			Metadata metadata = new Metadata();
			metadata.set(Metadata.RESOURCE_NAME_KEY, f.getName());
			is = new FileInputStream(f);
			ContentHandler handler = new BodyContentHandler();
			ParseContext context = new ParseContext();
			context.set(Parser.class,parser);
			//2、執行parser的parse()方法。
			parser.parse(is,handler, metadata,context);
			for(String name:metadata.names()) {
				System.out.println(name+":"+metadata.get(name));
			}
			return handler.toString();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (TikaException e) {
			e.printStackTrace();
		} finally {
			try {
				if(is!=null) is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return null;
	}

}

測試程式如下:
package com.ljh.test;

import java.io.File;

import org.junit.Test;

public class TikaBasicUtilTest {

	@Test
	public void test() {
		TikaBasicUtil tbu = new TikaBasicUtil();
		System.out.println(tbu.fileToTxt(new File("D:/G組-C羅壓哨助攻扳平 葡萄牙2-2美國保晉級希望.docx")));
	}

}
輸出結果如下:

cp:revision:3
meta:last-author:lujinhong
Last-Author:lujinhong
meta:save-date:2014-06-23T04:24:00Z
Application-Name:Microsoft Office Word
dcterms:created:2014-06-23T04:23:00Z
Author:lujinhong
Application-Version:15.0000
Character-Count-With-Spaces:1188
date:2014-06-23T04:24:00Z
Total-Time:1
extended-properties:Template:Normal.dotm
meta:line-count:8
creator:lujinhong
publisher:
Word-Count:177
meta:paragraph-count:2
Creation-Date:2014-06-23T04:23:00Z
extended-properties:AppVersion:15.0000
meta:author:lujinhong
Line-Count:8
extended-properties:Application:Microsoft Office Word
resourceName:G組-C羅壓哨助攻扳平 葡萄牙2-2美國保晉級希望.docx
Paragraph-Count:2
Last-Save-Date:2014-06-23T04:24:00Z
Revision-Number:3
meta:creation-date:2014-06-23T04:23:00Z
dcterms:modified:2014-06-23T04:24:00Z
Template:Normal.dotm
Page-Count:1
meta:character-count:1013
dc:creator:lujinhong
meta:word-count:177
Last-Modified:2014-06-23T04:24:00Z
extended-properties:Company:
modified:2014-06-23T04:24:00Z
xmpTPg:NPages:1
extended-properties:TotalTime:1
dc:publisher:
Character Count:1013
meta:page-count:1
meta:character-count-with-spaces:1188
Content-Type:application/vnd.openxmlformats-officedocument.wordprocessingml.document
上半時美國隊開球。第5分鐘,葡萄牙隊率先進球,維羅索左路45度把球吊入禁區,美國後衛卡梅倫解圍失誤,納尼在遠門柱附近右腳抽射球門上角建功,葡萄牙1-0美國。
第9分鐘,鄧普西突破被斷,無隊友接應。第11分鐘,美國長傳反擊,科斯塔頭球解圍。第12分鐘,阿爾維斯剷倒約翰遜,美國隊獲得禁區前任意球,鄧普西主罰大力攻門,球擦著橫樑高出。第16分鐘,葡萄牙中鋒波斯蒂加受傷,被埃德換下。第18分鐘,美國右路傳中,鄧普西禁區左肋抽射打高。
第24分鐘,美國隊後場斷球反擊,布拉德利禁區前抽射,球擦著橫樑高出。第27分鐘,祖西傳球,鄧普西禁區右肋抽射,科斯塔堵槍眼。1分鐘後,布拉德利遠射稍偏。第32分鐘,美國反擊,約翰遜遠射打偏。第34分鐘,維羅索遠射打在後衛身上,C羅拿球被吹越位。
第35分鐘,C羅遠射被霍華德撲住。第40分鐘,瓊斯受傷,主裁判吹停比賽,進入喝水時間。第42分鐘,葡萄牙反擊,C羅分球,納尼右路遠射被撲出。第43分鐘,葡萄牙獲得禁區前任意球,C羅主罰打高。第45分鐘,納尼遠射打中立柱,埃德補射被霍華德用指尖擋出。上半時結束,葡萄牙1-0美國。
下半時易邊,葡萄牙隊用卡瓦略換下阿爾梅達。第48分鐘,卡梅倫解圍打在隊友被貝斯勒身上,埃德搶射打高。第55分鐘,美國隊錯失良機,約翰遜右路下底傳中,布拉德利5碼處推射,科斯塔門線堵槍眼。第62分鐘,葡萄牙反擊,C羅禁區右肋射門打偏。
第64分鐘,美國隊扳平比分,角球罰出被後衛解圍出禁區,瓊斯外圍拿球橫向閃過納尼,右腳大力抽射,球飛進球門死角,葡萄牙1-1美國。
第66分鐘,葡萄牙反擊,納尼右路傳中,遠端梅雷萊斯抽射被門將撲出。第68分鐘,葡萄牙用完第三個換人名額,瓦雷拉換下梅雷萊斯。第74分鐘,納尼突入禁區摔倒,裁判沒有吹罰點球。1分鐘後,瓊斯滑鏟放倒穆蒂尼奧,吃到黃牌。第80分鐘,納尼右路禁區前橫切遠射打高。
第81分鐘,美國隊反超比分!瓊斯中路分球,葉德林右路下底傳中,布拉德利12碼處推射打在後衛身上,祖西左路拿球傳中,鄧普西用胸口把球撞進空門,美國2-1葡萄牙。
第86分鐘,維羅索直塞,C羅在越位位置完成射門。葡萄牙右路起球,C羅頭球攻門頂偏。第93分鐘,葡萄牙左路起球,C羅頭球頂偏。第95分鐘,C羅右路傳中,瓦雷拉頭衝頂破門,2-2!全場結束,美國2-2葡萄牙。
葡萄牙(433):22-貝託/21-佩雷拉、2-阿爾維斯、13-科斯塔、19-A-阿爾梅達(46'卡瓦略)/8-穆蒂尼奧、4-維羅索、16-梅雷萊斯(68'瓦雷拉)/17-納尼、23-波斯蒂加(16'埃德)、7-C羅
美國(4231):1-霍華德/7-比斯利、5-貝斯勒、20-卡梅倫、23-F-約翰遜/15-貝克曼、13-瓊斯/19-祖西(91'岡薩雷斯)、11-貝多亞(72'葉德林)、4-布拉德利/8-鄧普西(87'沃多洛斯基)