1. 程式人生 > >Apache TIKA---抽取多型別檔案文字內容和檔案的“隱藏資訊”

Apache TIKA---抽取多型別檔案文字內容和檔案的“隱藏資訊”

前言

有這樣一個需求“使用者上傳一個檔案,要得到這個檔案的文字內容,和它的建立時間(使用者建立的時間)”
乍一看上去,很簡單啊,可以按位元組讀檔案或按行讀檔案,也可以根據檔案的型別引入對應的jar包去獲取內容。檔案的建立時間,我找了一些資料,可以通過下面程式碼實現:

Process p = Runtime.getRuntime().exec("cmd /C dir "           
                    + filePath  
                    + "/tc" );  
InputStream is = p.getInputStream();   
BufferedReader br = new
BufferedReader(new InputStreamReader(is)); String line; while((line = br.readLine()) != null){ if(line.endsWith(".txt")){ strTime = line.substring(0,17); break; } }

到了這裡,我正打算去實現,轉念一想,apache的工具包裡有提供檔案複製的功能,即IOUtils.copy(InputStream input, OutputStream output)

,那同樣的Apache是否擁有提取檔案內容和時間的工具類呢,還真有!這就是接下來要說的Apache Tika

Tika

The Apache Tika™ toolkit detects and extracts metadata and text from over a thousand different file types (such as PPT, XLS, and PDF). All of these file types can be parsed through a single interface, making Tika useful for search engine indexing, content analysis, translation, and much more. You can find the latest release on the download page. Please see the Getting Started page for more information on how to start using Tika.

官方地址

官方介紹說它可以支援上千種檔案型別,同時支援搜尋引擎索引、內容分析、翻譯。。。看到這,感覺我又發現了新大陸!!!
下面這張圖是tika的主要結構圖:
tika_architecture.jpg

tika會根據你輸入的檔案自動分配解析工具,如PDFParserOOXMLParserHtmlParser等等,然後解析語言、MIME type、文字內容和Metedata

我這裡使用到Tika兩個功能:

  • 文字內容抽取
  • 元資料(MetaData)的獲取
    補充:MetaData即描述資料的資料!如一個檔案的建立者,建立時間,文件型別,位元組數等等。維基百科

使用

GUI

將專案checkout到本地並執行mvn clean install,然後進入tika-app目錄,執行

java -jar tika-app-1.4.jar --gui

如下動圖

gui

Server

關於官方指定使用curl,我就在ubuntu上啟動了server,啟動的方式為

java -jar tika-server/target/tika-server.jar

測試了一個檔案,如下圖

server.png

還有其他的方法,如:

  • Extract plain text:
    curl -T price.xls http://localhost:9998/tika

  • Extract text with mime-type hint:
    curl -v -H "Content-type: application/vnd.openxmlformats-officedocument.wordprocessingml.document" -T document.docx http://localhost:9998/tika

  • Get all document attachments as ZIP-file:
    curl -v -T Doc1_ole.doc http://localhost:9998/unpacker > /var/tmp/x.zip

  • Extract metadata to CSV format:
    curl -T price.xls http://localhost:9998/meta

  • Detect media type from CSV format using file extension hint:
    curl -X PUT -H "Content-Disposition: attachment; filename=foo.csv" --upload-file foo.csv http://localhost:9998/detect/stream

可根據自己的需要去呼叫

整合本地服務

雖然tika自己提供了服務,但是有的時候,我們想在本地自己搭建一個服務,在抽取完內容後或許還要做些其他的工作。就這個目的,我將1.14版本的tika整合到了本地,並自己搭建了一個簡單的服務,介面如下

1.png

2.png

依然使用swagger整理介面,如果你對swagger不瞭解,可以點這裡,程式碼放在了github,歡迎檢視

歡迎瀏覽我的個人部落格

相關推薦

Apache TIKA---抽取多型別檔案文字內容檔案的“隱藏資訊

前言 有這樣一個需求“使用者上傳一個檔案,要得到這個檔案的文字內容,和它的建立時間(使用者建立的時間)” 乍一看上去,很簡單啊,可以按位元組讀檔案或按行讀檔案,也可以根據檔案的型別引入對應的jar包去獲取內容。檔案的建立時間,我找了一些資料,可以通過下面程式

window下cmd通過Type命令檢視檔案文字內容通過Echo命令新增文字內容檔案

CMD是Command的簡寫,是Windows系統下的類DOS精簡系統。 在CMD視窗中,檢視文字檔案內容是用的命令是:TYPE 按下快捷鍵:WIN+R,調出執行視窗,輸入:CMD CMD的TYPE指令,語法:type 驅動器:\資料夾\檔名 示例參考: typ

Apache Tika 1.20 釋出,內容抽取工具集合

   Apache Tika 1.20 已釋出,Tika 是一個內容抽取的工具集合 (a toolkit for text extracting) 。它集成了 POI 和 Pdfbox,並且為文字抽取工作提供了一個統一的介面。其次,Tika 也提供了便利的擴充套件 API,用來

Linux查詢檔案內容檔案位置

  find / -amin -10        # 查詢在系統中最後10分鐘訪問的檔案    find / -atime -2        # 查詢在系統中最後48小時訪問的檔案    find / -empty # 查詢在系統中為空的檔案或者資料夾    find / -group cat # 查詢在

java鍵盤輸入檔案內容要儲存的檔名稱,自動建立檔案並儲存內容檔案

不多說了,直接貼程式碼,兩種書寫方式,實現方式相同,有個有方法 中間加了一個方法,也算練習一下 還是應該使用Scanner進行資料的輸入,列印流進行資料的輸出,以後寫個總結 使用Scanner package com; import java.io.

關於jsjq獲取文字內容文字內容的值

jq:     $('.class').text()  獲取文字的內容;     $('.class').text('想要在文字框內放置的內容');   在標籤內放置內容 js: documentgetElementById('id').innerHTML    獲取文字

kettle案例一抽取gz格式文字內容儲存到mongodb

版本和啟動 我們這裡使用的7.1版本,官網下載的安裝包為pdi-ce-7.1.0.0-12.zip。 安裝目錄下非常多的執行程式,但沒有明顯的啟動圖示。 Kettle常用三大家族:Spoon、Pan、Kitchen。 Spoon:通過圖形介面方式

PHP+KINDEDIT+mysql+javascript實現文字編輯檔案上傳功能例項

這個功能是本人寫的一個會議通知的新增功能。需要用到kindeditor網頁文字編輯器,功能強大。具體大家GOOGLE一下。 檔案一add.php編輯頁面 <?php //新增會議通知的編輯介面 include('menu.php'); include ("hea

SpringBoot多檔案上傳檔案下載

1、前端的form表單: <form id="form"  action="controller層的多檔案上傳方法訪問路徑" method="post" enctype="multipart/form-data"> <input  type="file" n

Linux:基礎IO(cIO庫函式詳細介紹)(IO系統呼叫介面詳細介紹)(兩者關係:檔案描述符檔案指標)

目錄 c系統中的庫函式: fopen:開啟檔案 fclose:關閉檔案 fwrite:向檔案寫入一個數據塊 fread:讀寫 fprintf:格式化輸出到一個流/檔案中 fseek:移動/跳轉 到當前 讀取/寫入位置 fgets:獲取字串 fput:把字串寫入到指

檔案上傳檔案下載

檔案上傳: 1.首先,設計前臺頁面。 要在form表單中加上 enctype="multipart/form-data",指明接收請求的Servlet。 <form action="upload" method="post" enctype="multipart/form-

什麼是檔案描述符檔案控制代碼?兩者是什麼關係?

在python裡面有這樣一個函式: 網上解釋什麼是,檔案描述符: 核心(kernel)利用檔案描述符來訪問檔案。檔案描述符是非負整數。開啟現存檔案或新建檔案時,核心會返回一個檔案描述符。讀寫檔案也 需要 檔案描述符來指定待讀寫的檔案。 乍一看,怎麼和檔案控制代碼的描述很想,網上搜了一下:

cmake編譯檔案的步驟檔案結構,dlib開源庫的ubuntu共享庫編譯及使用

一、cmake的工作機制         使用CMake很簡單。 構建過程是通過建立一個或多個CMakeLists檔案(實際上是CMakeLists.txt,但本指南將在大多數情況下脫離擴充套件)控制在專案的每個目錄中。 CMakeLists檔案應該包含CMake簡單語言的

python 獲取請求連結下載檔案的大小檔案特徵

###根據url連結提取下載檔案的大小特徵和下載檔案型別 def getRemoteFileSize(url, proxy=None): ''' 通過content-length頭獲取遠端檔案大小 ''' opener = urllib2.bu

linux下檔案目錄結構檔案操作命令

剛學linux,總結下。 檔案目錄結構 linux 是多使用者作業系統,多個使用者可以共享的全部硬體和軟體。 ubuntu沒有盤的概念,有且只有一個根目錄 / ,所有的檔案都在根目錄下面。 根目錄下有個home資料夾,是系統預設的使用者家目錄,新增使用者的家目錄都放在這裡。 其他資料

C# 判斷檔案是否存在檔案讀寫

一、檔案是否存在 c#中操作IO非常簡單,下面介紹如何判斷資料夾或檔案是否存在的方法。  程式碼如下: //判斷資料夾是否存在,不存在則建立資料夾 if (!System.IO.Directory.Exists(@"E:\Files")) {    System.IO.D

文字內容中提取有效資訊

例如a.txt中有如下內容$ABC,eqwe,0123,N,we23,E,234$ABD,fkjd,2454,N,fwer,E,456$AB,fhew,9478,N,wewf,E,rnju$ABC,we

java中使用檔案輸入流檔案輸出流進行檔案讀寫的用例!

package com.cfkyit.io; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutp

java檔案相關(檔案追加內容檔案內容清空、檔案內容讀取)

   public static List<String> readInfoFromFile(String fileName) {         File file =new File(fileName);         if(!file.exists()) {             ret

Linux中檔案的壓縮檔案傳輸

1)檔案在系統中的傳輸 1 scp                  ##傳輸速度相對較慢,這屬於一個遠端複製的過程   scp file [email protected]:dir    ##上傳               scp [email pr