使用Apache Tika指令列抽取文件的內文 / Using Apache Tika Extract File’s Content
如果要做檔案中的全文檢索服務,那就要先把檔案的內文抽取出來轉換成字串,這樣才能提供全文檢索引擎進行索引。Apache Tika是一個萬用型的檔案內文抽取工具,我們可以用指令列來操作Tika,就能從PDF、Microsoft Office、Open Document、純文字檔案等文件抽取內文。非常好用!
Apache Tika下載 / Down Apache Tika
Apache Tika原本是Java的一個套件,但它也提供了指令端的操作方式。要使用指令端來操作,就必須先取得tika-app-x.xx.jar檔案。目前最新版是tika-app-1.14.jar。下載網址如下:
- Apache官方網站下載:tika-app-1.14.jar
http://www.apache.org/dyn/closer.cgi/tika/tika-app-1.14.jar - 備份:GitHub、OneDrive、Google Drive、Mega、Box、MediaFire
Tika支援格式 / Support Formats
Tika支援三十幾種的檔案格式,根據Content Extraction with Tika這篇的說明,支援格式如下:
- 壓縮檔案:因為壓縮檔會在一個檔案內包含多個檔案,所以Tika會將全部包含在內的檔案抽取出來。
- .tar
- .jar
- .zip
- .bzip2
- .gz
- .tgz
- 文字檔案:
- .doc (MS Word Document)
- .xls (MS Excel Document)
- .ppt (MS PowerPoint Document)
- .rtf (Rich Text Format)
- .pdf (Adobe Portable Document Format)
- .html
- .xhtml
- OpenDocument
- .txt (Plain text)
- 圖片檔案:
- .bmp
- .gif
- .png
- .jpeg
- .tiff
- 聲音檔案:
- .mp3
- .aiff
- .au
- .midi
- .wav
- 其他格式:
- .pst (Outlook mail)
- .xml
- .class (Java class files)
上面的圖片、聲音等檔案的抽取似乎並不是OCR影像辨識或是聲音辨識,而只是抽取metadata而已。
示範檔案 / Demo Files
為了方便示範,我也找幾個不同種類的檔案來試著抽取全文看看:
- pdf:https://docs.google.com/presentation/d/1uPTNQAXXSw9pxsy7-Q1RyHBb4XwB9JyTm_nBp38Cqcc/export/pdf
- doc:http://pulipulichen.github.io/blogger/posts/2017/03/tike/201104 研究計畫 數位圖書館之閱讀標註學習社群經營與加值應用研究.doc
- docx:https://docs.google.com/document/d/1PzGDdmwFFdOVwwkbdf96GZg7z27GEsW3UBGZUKmwUiY/export?format=doc
- odt:https://docs.google.com/document/d/1PzGDdmwFFdOVwwkbdf96GZg7z27GEsW3UBGZUKmwUiY/export?format=odt
- xls:http://pulipulichen.github.io/blogger/posts/2017/03/tike/不良品送修表.xls
- xlsx:https://docs.google.com/spreadsheets/d/1Sq2XapdnErl-vrj6mfWJPqaUDs17PtwgeMdZ8Df-pA4/export?format=xlsx
- ods:https://docs.google.com/spreadsheets/d/1Sq2XapdnErl-vrj6mfWJPqaUDs17PtwgeMdZ8Df-pA4/export?format=ods
- csv:https://docs.google.com/spreadsheets/d/1Sq2XapdnErl-vrj6mfWJPqaUDs17PtwgeMdZ8Df-pA4/export?format=csv
- tsv:https://docs.google.com/spreadsheets/d/1Sq2XapdnErl-vrj6mfWJPqaUDs17PtwgeMdZ8Df-pA4/export?format=csv
- ppt:http://pulipulichen.github.io/blogger/posts/2017/03/tike/20160905 序列分析工作坊 - Public.ppt
- pptx:https://docs.google.com/presentation/d/1uPTNQAXXSw9pxsy7-Q1RyHBb4XwB9JyTm_nBp38Cqcc/export/pptx
- odp:https://docs.google.com/spreadsheets/d/1uPTNQAXXSw9pxsy7-Q1RyHBb4XwB9JyTm_nBp38Cqcc/export/odp
- txt:https://docs.google.com/presentation/d/1uPTNQAXXSw9pxsy7-Q1RyHBb4XwB9JyTm_nBp38Cqcc/export/txt
- rtf:https://docs.google.com/document/d/1PzGDdmwFFdOVwwkbdf96GZg7z27GEsW3UBGZUKmwUiY/export?format=rtf
- html:https://docs.google.com/document/d/1PzGDdmwFFdOVwwkbdf96GZg7z27GEsW3UBGZUKmwUiY/export?format=html
指令列用法 / Command Line Utility Usage
使用指令列的時候必須先安裝Java工具。各種作業系統安裝Java的方式不同,請自行研究。如果順利安裝好的話,應該可以用「java –version」輸出正常的訊息,例如下圖:
tika指令列的用法如下:
java -jar [tika-jar-path] -t [file-path]
如果是在Linux環境下,那還需要加上額外的參數,以確保Tika將檔案正確輸出成UTF8編碼,避免中文變成「?」:
java -Dfile.encoding=UTF8 -jar [tika-jar-path] -t [file-path]
指令當中有兩個位置需要由你指定,這兩個位置最好都以絕對路徑表示:
- [tika-jar-path]:tika jar檔案的位置,例如「c:\tika-app-1.14.jar」或「/opt/tika-app-1.14.jar」。
- [file-path]:要轉換檔案的位置,可以用網址來表示,例如「https://docs.google.com/spreadsheets/d/1Sq2XapdnErl-vrj6mfWJPqaUDs17PtwgeMdZ8Df-pA4/export?format=ods」
使用示範 / Demo
Windows
Windows執行的指令可能是:
java -jar d:\tika-app-1.14.jar -t https://docs.google.com/spreadsheets/d/1Sq2XapdnErl-vrj6mfWJPqaUDs17PtwgeMdZ8Df-pA4/export?format=ods
執行結果如下:
Linux
如果是在Linux中執行,指令可能是:
java -Dfile.encoding=UTF8 -jar /opt/tika-app-1.14.jar -t https://docs.google.com/spreadsheets/d/1Sq2XapdnErl-vrj6mfWJPqaUDs17PtwgeMdZ8Df-pA4/export?format=ods
執行結果如下:
這樣就能簡單抽取文件的內文啦!
轉換成HTML / Convert Files to HTML
在上面的例子中,我使用了-t參數將檔案轉換成純文字輸出,但我們也可以用-h參數來將檔案轉換成HTML,並輸出到指定檔案中。
在Windows環境下執行的指令如下:
java -jar d:\tika-app-1.14.jar -h https://docs.google.com/spreadsheets/d/1Sq
2XapdnErl-vrj6mfWJPqaUDs17PtwgeMdZ8Df-pA4/export?format=ods > output.html
最後可以輸出一個output.html檔案,打開來可以看到以下畫面:
網頁裡面是用HTML所撰寫的表格喔。
小結 / In closing
在很久以前,我也在DSpace做過從文件中抽取內文的這種工作。詳細請看「DSpace擴增MediaFilter格式(安裝篇)」這篇。因為DSpace只能夠抽取PDF格式的內文,所以那時候的思維是將各種檔案轉換成PDF,這樣就能讓DSpace順利去進行索引。那時候使用的工具是OpenOffice跟JODconverter搭配使用,OpenOffice負責將各種文件轉換成PDF,而JODconverter則是跟OpenOffice溝通。但實際上這種做法非常難用。先不說OpenOffice很多時候無法正常讀取各種文件,而OpenOffice轉換的過程還相當吃記憶體,甚至容易造成當機。最後我只做了一個堪用的轉換器,雖然常常當機,但大致上還是能夠使用。
現在,只要使用Apache Tika,就能夠克服在DSpace那時候遇到的各種問題。不僅是從各種檔案抽取出有待索引的文字,也能夠用輸出成HTML的方式產生各種預覽檔案。
我終於超越那時候的自己了,真令人開心啊。