アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

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実装もあります。

本気で使いたい場合には、このあたりを利用すると、もっと便利な物ができたりするかもしれません。