OpenOfficeを使ってdoc/xls/pptを全文テキスト抽出
こんにちは、亀本です。
ちょっと今回は、iPhoneから外れて違う事です。
皆さんは、全文検索ってよく作りますか?作りますよね。作らないわけないですよね。
で、全文検索を作る時って、WordとかExcelとかの本文にも検索かけられるといいな、と 思いますよね。
そんな全文検索でWord/Excel/PPTを処理する方法としてポピュラーな方法としては、NamazuとwvWare、xlHtmlなどを使った方法があります。(こちらがよくまとまっています)
が。
wvWareやxlHtmlは少し古いので、新しいxlsxなどの形式に対応できなかったりもします。
それにMySQLで日本語全文検索するなら、やっぱりsenna使いたい!という気持ちになりますよね。ならないわけないですよね。
となれば、Namazuに依存しないように全文抽出だけをやれる方が嬉しいですね。
そこで今回は、バージョン古い問題を回避して上手く全文抽出をするために、試しにOpenOfficeを使って処理するようにしてみました。
まずサーバ側で
・X Window System
・OpenOffice.org
・VNC Server
を用意します。ひと通りyumなりaptなりでインストールしましょう。
xlsxなどはOpenOffice.org 3.0からの正式対応ですので、そのあたりにも対応させたいときは、適切なプラグインを拾ってくるなり、3.0をインストールするなりすればいいと思います。
所定の物をインストールしたら、VNC Serverを起動し、Displayに設定します。
# vncserver :2
# export DISPLAY=:2
次に、OpenOffice.orgのBASICマクロを登録します。
以下の図からOpenOffice.org BASIC(基本。。。てすごい訳ですねw)のエディタを選んで、適当なファイル(今回はStandard/Macro1)に以下のようなコードを登録します。
Sub ConvertDocToTxt( cFile )
cURL = ConvertToURL( cFile )
oDoc = StarDesktop.loadComponentFromURL(cURL, "_blank", 0, Array(_
MakePropertyValue( "Hidden", True ),_
) )
cFile = cFile + ".txt"
cURL = ConvertToURL( cFile )
oDoc.storeToURL( cURL, Array(_
MakePropertyValue( "FilterName", "Text (encoded)" ),_
)
oDoc.close( True )
End Sub
Sub ConvertXlsToTxt( cFile )
cURL = ConvertToURL( cFile )
oDoc = StarDesktop.loadComponentFromURL(cURL, "_blank", 0, Array(_
MakePropertyValue( "Hidden", True ),_
) )
cFile = cFile + ".txt"
cURL = ConvertToURL( cFile )
oDoc.storeToURL( cURL, Array(_
MakePropertyValue( "FilterName", "HTML (StarCalc)" ),_
)
oDoc.close( True )
End Sub
Sub ConvertPPTToTxt( cFile )
cURL = ConvertToURL( cFile )
oDoc = StarDesktop.loadComponentFromURL(cURL, "_blank", 0, Array(_
MakePropertyValue( "Hidden", True ),_
) )
cFile = cFile + ".txt"
cURL = ConvertToURL( cFile )
oDoc.storeToURL( cURL, Array(_
MakePropertyValue( "FilterName", "impress_html_Export" ),_
)
oDoc.close( True )
End Sub
Function MakePropertyValue( Optional cName As String, Optional uValue ) As com.sun.star.beans.PropertyValue
Dim oPropertyValue As New com.sun.star.beans.PropertyValue
If Not IsMissing( cName ) Then
oPropertyValue.Name = cName
EndIf
If Not IsMissing( uValue ) Then
oPropertyValue.Value = uValue
EndIf
MakePropertyValue() = oPropertyValue
End Function
我ながらやっつけコード。。。というところは気にしたら負けです。
このあたりを参考にしました。
これを登録したら、以下のようなコマンドを実行すると、test.doc.txtというファイルが生成されます
# openoffice.org -invisible "macro:///Standard.Module1.ConvertDocToTxt(/tmp/test.doc)"
Docファイルに関してはこれでUTF-8のテキストファイルが生成できるのですが、xlsやpptは直接テキストファイルに変換する事はできないので、HTMLファイルに変換しています。
それらからタグを除去するようにします。
特にPPTの場合は、ページ毎に別のHTML(text*.html)として生成されるので、これらを一括で読みこんで処理してあげればよいでしょう。
なんかもうちょっと時間があったら、これをちゃんとsennaと連携させるアップロードシステムまでまとめたかったですが、その辺は普通のPHPなので大丈夫だと思います。
今回はOpenOffice.orgのBASICマクロを利用してサクッとコマンドから変換をかける方法を紹介しましたが、実はちゃんとDevelopment APIも存在し、PHPからそれを利用するpunoというextension実装もあります。
本気で使いたい場合には、このあたりを利用すると、もっと便利な物ができたりするかもしれません。