2006/01/14
Jakarta POIで、パスワード保護されているMS-Wordがあぁぁ!
とある必要があって、MS-Word文書のテキストを抽出するために、Jakarta POIを使いました。
Word文書を処理するためのライブラリとして、POIの中にHWPFというサブプロジェクトがあるものの、正式リリースされておらず、おまけに開発も停止しているみたいなので、若干の不安を覚えつつも、他にこれという選択肢もないための消去法的な採用です。
でも、単体テストでは特に問題なく、テキストを抽出できました。めでたい。
ということで、どんな文書が存在するのか把握していないディレクトリの中を対象として、まとめてガサーっと処理してみると、最後の文書まで辿り着く前に、JVMのheapが足りないとOutOfMemoryErrorが発生してしまいます。何度やっても発生します。調べていくと、パスワード保護されている文書の処理で発生していることがわかりました。
HWPFのHWPFDocumentオブジェクトのコンストラクター内で呼ばれている、POIFSパッケージのクラスで問題が起こっているところまでは追跡しましたが、現時点で、最終的に犯人を補足できていません。というか、この時点で自ら捜査することに疲れ、世の中の誰かが既に名推理を発表していないか、探すことにしたのですが、それも見つけ出せていません。
さあ、この難事件の結末や如何に? 解決編を待て。
(解決するのだろうか。どこかに名探偵がいて、この中に犯人がいる、とかズバっと言って欲しいです)
- Category(s)
- Java,Open Source
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/takatsuka/jakarta-poi300130b930ef30fc4fdd8b773055308c30663044308bms-word304230413041/tbping
Re:解決編
2004年2月に、以下の場所で、HWPFの前身HDFでの同一現象についてニックさんが質問をしてライアンさんが回答していました。
http://java2.5341.com/msg/51164.html
ライアンさんはHWPFの開発者だったようで(今は既に手放されたみたいです)、ニックさんの質問に対して、次の製品(それが現在のHWPF)では対応するようなことを言われています。
なのに、同じ現象がHWPFで起きてしまって困ったものです。
でも、ライアンさんは、FileInformationBlockというクラスでファイルがencriptedかどうか判定するメソッドを用意してくれていたのでした。
という訳で、HWPFDocumentクラスを継承した独自クラスで、問題のコンストラクター内に、FileInformationBlockのisFEncriptedメソッドを使用して、読めない場合にはIOExceptionを投げるようにしました。
多分、解決。めでたしめでたし。