日々常々

ふつうのプログラマがあたりまえにしたいこと。

Apache POIでテキスト抽出

Apache POI - Text Extraction
使い方も難しくもなさそうだけど、実行環境が手元にないので斜め読みしながら勝手に翻訳。自信なんて無いよ?英語は普通に赤点だったし。過去のことは笑っとけ、笑っとけ。大して改善されてないけど。

Overview

ApachePOIは全ての対応したファイルフォーマットのテキスト抽出と、タイトルや著者といったファイルのメタデータに対するアクセスを提供します。
ダイレクトテキスト抽出クラスに加えて、POIはApacheTikaテキスト抽出ライブラリと連携できます。ユーザはTikaにより提供されるシンプルで役立つ機能を使いたいかもしれないので。

要するに、POIが対応しているフォーマットは全てテキスト抽出出来て、「ダイレクトテキスト抽出」と「ApacheTikaを使用した抽出」があるって事かな。ApacheTikaって知らない……。ダイレクトはStringで返ってきそうだし、大抵の要件はそれでよさそう。

Common functionality

POIのテキスト抽出クラスは org.apache.poi.POITextExtractor を拡張しています。全ての拡張クラスで getText() を使用できます。多くの場合のために、このメソッドは全てのテキストを返します。しかしながら、いくつかの拡張クラスでは対象を絞ったテキスト抽出メソッドが提供されます。これらのメソッドを使う場合もあるかもしれません。

POIFS/OLE2のテキスト抽出クラスは org.apache.poi.POIOLE2TextExtractor を拡張しています。これはHPSFドキュメントメタデータを取得する共通メソッドを提供します。

POI3.5以降で利用できる、OOXMLのテキスト抽出クラスは org.apache.poi.POIXMLTextExtractor を拡張しています。これはOOXMLメタデータを取得する共通メソッドを提供します。

【原文から変更1】 HPFS → HPSF
リンク切れと思ったらFとSが逆っぽい。たぶん。

【原文から変更2】 POIOOXMLTextExtractor → POIXMLTextExtractor
JavaDocを信じてみる。実際どうなってるかはわからないけど。

POITextExtractor.getText() で全文取得が可能になってるけど、やっぱそのままじゃ使い辛いのかも。例えば PowerPointExtractorには getNotes() とかがあったり。メソッド名の通り、スライドじゃなくノートの文章が抽出できるのだと思います。
POITextExtractorがトップレベルの抽象クラスで、サブクラスに POIOLE2TextExtractor とか POIXMLTextExtractor があります。これらを拡張したのが具象クラスになるみたいです。

Text Extract Factory -POI 3.5 or lator

POI3.5での新しいクラス org.apache.poi.extractor.ExtractorFactory は、WorkbookFactory 同等の機能を提供します。ImputStream かファイル、 POIFSFileSystem または OOXML Package を渡せば、テキスト抽出クラスを作って返します。

あークラス違うのか、形式で振り分けいるのかねぇ…と思ったら Factory ありましたか。よかったよかった。WorkbookFactoryと同様に使えるってことらしいです

Excel

.xlsファイルには org.apache.poi.hssf.extractor.ExcelExtractor を使えます。テキストか数式かを選んで出力できます。
.xlsxファイルには org.apache.poi.xssf.extractor.XSSFExcelExtractor を使って同じ事ができます。(POI3.5以降)
.xlsファイルには org.apache.poi.hssf.extractor.EventBasedExcelExtractor もあります。これは EventUserModel コードに基づいて、抽出のために少ないメモリで通常出力されます。しかしながら、これは複雑な数式の正確な出力に問題があります。

EventUserModelはこれだと思うんだけど、使ったこと無いのでちょっとピンとこない。何かのイベントを処理するんだろうけども。ピンとこないので訳もよくわかんない。ううん。見なかったことにして ExcelExtractor 使えば良いよ!

Word

Word97-2003の .doc ファイルにはscratchpadに org.apache.poi.hwpf.extractor.WordExtractor があります。
Word6,Word95のファイルにはscratchpadの org.apache.poi.hwpf.extractor.Word6Extractor を使えます。(POI3.7)
.docxファイルは org.apache.poi.xwpf.extractor.XPFFWordExtractor を使います。(POI3.5以降)

PowerPoint

.pptファイルはscratchpadにある org.apache.poi.hslf.extractor.PowerPointExtractor でファイルからテキストが取得できます。オプションでスライドショーかノートに限定して出力出来ます。
.pptxファイルは org.apache.poi.xslf.extractor.XSLFPowerPointExtractor を使って同じ事ができます。(POI3.5以降)

Publisher

.pubファイルはscratchpadにある org.apache.poi.hpbf.extractor.PublisherExtractor でファイルからテキストが取得できます。

Visio

.vsdファイルはscratchpadにある org.apache.poi.hdgf.extractor.VisioTextExtractor でファイルからテキストが取得できます。

Embedded Objects

Excel、Word、PowerPointVisioのExtractorがあります。Worksheetにこれらのオブジェクトが埋め込まれていた場合、 ExtractorFactory は、それを使えるように復元できます。

下にコード例が続きます。
要するに、ExtractorFactory.getEmbededDocsTextExtractorsで埋め込まれたオブジェクトのExtractorが作れますよって事です。Extractorを作った後はinstanceofで見てますが、勿論 getText() で事足りるなら必要ありません。