# Apache Tika Server 介紹與安裝
## Apache Tika Server 簡介
Apache Tika Server 是一個基於 Apache Tika 的獨立服務,它提供了一種方便的方式來檢索和提取各種文件的內容和元數據。無論是文本文檔、電子表格、演示文稿、圖像、音頻還是視頻,Tika Server 都可以處理各種類型的文件。它是 Apache Tika 的一個功能強大的子項目,可以幫助開發人員在他們的應用程序中進行文本分析和信息擷取。
Tika Server 採用了客戶端-服務器架構,可以通過 HTTP 協議接收請求並返回處理結果。這使得 Tika Server 可以與不同的客戶端應用程序進行交互,包括 Web 應用程序、命令行工具或其他服務。它的設計目標是提供一個簡單易用的介面,使開發人員能夠輕鬆地將 Tika 的功能集成到他們的應用程序中。
Tika Server 提供了各種功能和服務,包括文本提取、元數據擷取和語言檢測。它可以將輸入文件轉換為純文本,並提取出其中的文字內容、元數據(如作者、標題、創建日期等)以及結構化的信息(如表格、列表等)。此外,Tika Server 還支持自然語言處理功能,例如斷詞、詞性標註和命名實體識別,這些功能可以幫助開發人員進行更高級的文本分析。
## Windwos 環境安裝
* 安裝 Java Runtime , 這邊我選擇 [Microsoft 提供的 OpenJDK 17](https://learn.microsoft.com/zh-tw/java/openjdk/download),Oracle 提供的那個之前有些授權問題。
* 下載 Apache Tika Server,就一個 [tika-server-standard-2.7.0.jar](https://www.apache.org/dyn/closer.lua/tika/2.7.0/tika-server-standard-2.7.0.jar) 而已。
* 下載 [Apache Commons Daemon binary distributions for Windows](https://downloads.apache.org/commons/daemon/binaries/windows/),**commons-daemon-1.3.3-bin-windows.zip** 。
* 建立資料夾 `D:\TikaServer` jar 跟 zip 解壓丟進去,**prunsrv.exe** 改用 amd64 目錄下面那一個,因為佈署在 x64 的環境下。
* 完成上述動作後資料夾下只要留下,**prunsrv.exe**、**tika-server-standard-2.7.0.jar**、**prunmgr.exe** 三個檔案就可以了。
* 新增 'InstallTikaServer.bat' 檔內容約略如下,建立好後執行 BAT 就可以 Tika Server 註冊進 Windwos 服務。
bat檔中有一段 `++StartParams=-host#*` 設定服務 Listen 所有的主機可用的IP,不然預設只會在 127.0.0.1:9998 上運作。
```batch
REM 放置檔案的目錄
SET BasePath=D:\TikaServer
REM 根據安裝 Java 版本不同路徑可能會有所差異
SET JvmDllPath="C:\Program Files\Microsoft\jdk-17.0.7.7-hotspot\bin\server\jvm.dll"
prunsrv.exe //IS//TikaServer ^
--DisplayName="Tika Server" ^
--Description="Tika Server" ^
--Install="%BasePath%\prunsrv.exe" ^
--Startup=auto ^
--LogPath="%BasePath%\Logs" ^
--Jvm=%JvmDllPath% ^
--Classpath="%BasePath%\tika-server-standard-2.7.0.jar" ^
--StartMode=jvm ^
--StartClass=org.apache.tika.server.core.TikaServerCli ^
--StartMethod=main ^
--StopMode=jvm ^
--StopClass=org.apache.tika.server.core.TikaServerCli ^
--StopMethod=stop ^
++StartParams=-host#*
```
* 新增 'RemoveTikaServer.bat' 檔內容約略如下,這檔案是要把 Tika Server 從服務移除時才需要執行。
```batch
prunsrv.exe //DS//TikaServer
```
* 將 **prunmgr.exe** 更名為 **TikaServer.exe**,這個名字是根據上面註冊服務時使用的名字決定。
* 後續透過 **TikaServer.exe** 就可以調整服務參數,或重啟服務。
## 使用範例
* 透過 C# 呼叫 TikaServer 取得檔案中的文字資訊。
```csharp
var filePath = @"D:\TestData\xxxx.docx";
var fileStream = File.OpenRead(filePath);
var content = new StreamContent(fileStream);
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Put, "http://127.0.0.1:9998/tika");
request.Content = content;
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain"));
var response = await client.SendAsync(request);
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseContent);
```
* 透過 curl 呼叫 TikaServer 取得檔案中的文字資訊。
```bash
# 回傳 html 格式的本文
curl -s -T 資通安全法說明.pdf http://127.0.0.1:9998/tika
# 回傳純文字格式的本文
curl -s -T 資通安全法說明.pdf http://127.0.0.1:9998/tika -H "Accept: text/plain"
# 回傳 json 格式的資料,這種格式資料會在豐富一點,除了一個欄位是 html 本文外 ,還有一些其他的檔案資訊會一併取得
curl -s -T 資通安全法說明.pdf http://127.0.0.1:9998/tika -H "Accept: application/json"
# 單純判讀檔案類型
curl -s -T 資通安全法說明.pdf http://127.0.0.1:9998/detect/stream
```
## 補充說明
* Tika 可以讀取的文件總類非常多 doc、docx、ppt、pptx、pdf、xls、xlsx、ods、odt 基本常見的應該都有支援。
* Tika Server 預設只 Listen 127.0.0.1:9998,如果要改成 0.0.0.0:9998 要注意安全性問題,這個 API 沒有可以設定授權驗證的功能。
* Tika 除了讀取本文外,也可以拿來做檔案類型的判讀。(不是單純看副檔名那種)
* Linux 環境安裝的話直接用 docker compose 佈署簡單乾淨不黏牙。
## 網路參考資料
* [Apache Tika 官方網站](https://tika.apache.org/)
* [Apache Commons Daemon](https://commons.apache.org/proper/commons-daemon/binaries.html)
* [Apache Commons Daemon binary distributions for Windows](https://downloads.apache.org/commons/daemon/binaries/windows/)
* [Apache Tika實戰](https://iter01.com/524316.html)