年後到現在的都在忙的專案中本人主要負責的模組就是文件解析這一部分,做的時候是各種踩坑各種鬧心啊,好歹是終於結束了,現在把專案中各種文件的解析做個總結,以備後用,這次專案中主要解析的文檔包括office文件、pdf、csv、rtf、txt、jtd以及eml、msg和pst格式的郵件,還有rar和zip壓縮包的解壓,其實還有一個mlf格式的文件,但是這個經過我的研究以及公司大佬的研究,暫時沒法攻克難關,所以這種格式的文件就只能暫時先放棄了,其他的解析都是做出來了的,主要就是這些,後面我會一個一個的全部總結出來,關於文件的解析本人使用的是apache的Tika做的。
今天我們就先來看這個jtd檔案的解析,可能有人不知道這個jtd檔案是什麼,我這裡先做個解釋:
jtd格式文件是由日本的文字处理软件一太郎生成的文件格式
可以理解成jtd格式檔案就是我們平常用的word,只不要需要用一太郎軟體才能編輯打開,給大家看一下這個一太郎軟體長什麼樣子:
剛看到這個需求的時候很尷尬啊,這個怎麼做,還是日本的軟體,查資料也看不懂啊,在百度和stackoverflow上查也沒查到,這時候多虧了公司一位能看的懂日語的大佬啊,這位大佬在一個日文的網站上找到了解決辦法,網址是http://d.hatena.ne.jp/satorufujimori/20070227/1172549793
解決方法就是使用vbs腳本,將jtd格式檔案轉換為txt文件,然後再解析對應的txt取得到內容,網站上的腳本如下所示:
//taro2txt.vbs Set taro = CreateObject("JXW.Application") taro.Visible = True taro.Documents.Open "c:\taro\a.jtd" taro.ActiveDocument.SaveAs "c:\out\a.txt", "", "", "", 10, "ShiftJIS" //※1 taro.Quit
大家注意其中的10,這是個標識符,10表示將jtd格式檔案轉換成txt格式的文件,如果想要將jtd格式文件轉換成其他格式的文件需要將10換成其他的標識符,但是比較尷尬的是我們並沒有找到具體的文檔說明到底哪個數字表示哪種文檔,然後當時我從0試到100,亂七八糟的格式出來了一大堆,有用的只有這個10,也就是只能將jtd格式的文件轉換成txt格式的文件,這樣的話原本文件中的圖片就都消失了,但是我們的業務是將文件內容讀取出來,入solr做檢索的,所以沒有圖片就沒有圖片了,後來也就採用了這種辦法來解決問題。
透過上面腳本是可以轉換不帶密碼的jtd文件為txt文件,但是賊尷尬的是我們的jtd格式的文件是帶有密碼的,這個就尷尬了,不過幸好最後也解決了,我忘了當時是怎麼解決的,但是解決辦法如下所示:
//taro2txt.vbs Set taro = CreateObject("JXW.Application") taro.Visible = True taro.Documents.Open "c:\taro\a.jtd",password//在此处加上密码 taro.ActiveDocument.SaveAs "c:\out\a.txt", "", "", "", 10, "ShiftJIS" //※1 taro.Quit
腳本完成後直接點擊運行就可以將特定的jtd文件轉換成txt文件,然後再去處理txt檔案提取內容即可(txt格式檔案內容提取後面會在另外的文章中說明)。
上面的問題解決了,但是還有問題,我總不能為所有的jtd文件都建一個腳本文件吧,況且客戶那邊有哪些文件我也不知道,所以就想著給vbs腳本傳遞參數,雖然不會vbs的語法,但是按照網上說的照貓畫虎還是寫出來了,具體的腳本內容如下所示:
Option Explicit Dim a0 : a0 = WScript.Arguments(0) Dim a1 : a1 = WScript.Arguments(1) Dim a2 : a2 = WScript.Arguments(2) Dim taro ExchangeFile a0, a1, a2 Sub ExchangeFile(src,dest,password) Set taro = CreateObject("JXW.Application") taro.Visible = True taro.Documents.Open src,password taro.ActiveDocument.SaveAs dest, "", "", "", 10, "" taro.Quit End Sub
其中a0表示的是jtd文件的路徑,a1表示要產生的txt格式檔案的路徑,a2表示jtd檔的密碼,其實就是傳遞參數呼叫函數的過程。
腳本完善以後就是使用java呼叫vbs腳本的問題,這個問題我在stackoverflow上找到了答案,呼叫方法如下所示:
public static void main(String[] args) { try { Runtime.getRuntime().exec( "wscript D:/Send_Mail_updated.vbs" ); } catch( IOException e ) { System.out.println(e); System.exit(0); } }
透過以上的一系列步驟就可以成功的將jtd文件轉換成txt文件,但是這其中有幾個問題:
透過java程式呼叫vbs腳本並沒有回傳值表示txt檔是否真的產生了,如果密碼是錯的是無法產生對應的txt檔案的,我的處理方法每隔一段時間去查看一下txt檔案是否生成了,一定次數後就判斷轉換失敗,次數是根據檔案大小判斷的,如10M的檔案就每隔5秒檢查一次,一共檢查10次,如果沒生成txt檔案就判定失敗,這樣做在嘗試密碼的時候就十分浪費時間,並且還可能會出現文件比較大,或者機器配置不夠好,本來能夠產生txt檔案的,但是檢查時間過了直接判定為不能正確轉換;
#每次執行vbs腳本的時候都會打開一太郎軟體,並且在嘗試密碼的時候,如果密碼錯誤就會在部署應用程式的伺服器上出現一個windows的錯誤彈窗,雖然最後一太郎的進程會被殺掉,但是在沒有被殺掉之前客戶是能明顯看到一太郎程式和錯誤提示的,這個是很尷尬的事情;
如果jtd檔案過大,例如檔案達到30M的時候,腳本的轉換速度就很慢很慢了,在問題2中也說到了在檔案的轉換過程中客戶是能在伺服器上看到一太郎程式的,如果客戶在此期間直接把一太郎幹掉了,那麼檔案的轉換肯定是失敗的;
以上的問題暫時還沒有解決,後面還要看在客戶那邊部署以後的使用情況,如果客戶那邊的jtd格式文件都是10M以下的,那麼應該是沒有太大的問題的,但是如果文件超過了30M,轉換的過程肯定會慢,而且隨時面臨著在轉換過程中一太郎軟體被幹掉的風險,具體怎麼樣還需要看客戶的試用情況了吧。
關於jtd格式的檔案解析暫時就說到這裡,至於jtd格式檔案轉換成txt格式檔案後內容的提取我會在後面寫的。
以上是jtd格式檔案轉換解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!