2012年6月14日木曜日

PHP:COMでMSワードにアクセスするメモ

仕事がらみでPHPを使ってMS-Wordの中身を抜き出す方法を調べたメモ。

PHP:COMモジュール

PHPの標準で、MS-Wordを直接扱えるCOMモジュールが提供されている。
COMというのはOLE2の基盤技術のことで、アプリケーションから別のアプリケーションを呼び出して使うためのプロトコル(?)らしい。余り詳しくはないので、間違っているかも。

ともあれ、COMモジュールを使うには、
・OSがWindowsで、
・MS-Wordがインストールされている、
のが条件。
PHP:COMモジュール自体もウィンドウズ版でのみ提供されている。

自分の環境は、
Windows7(64bit)、MSOffice2003、XAMPP、という条件で動いた。

php.ini設定

php.iniの設定で、COMを使えるように変更する必要がある。
ここの実行時設定にあるディレクティブを、
デフォルトのままコメントを削除したら動いた。

dcomcnfgの設定

スターとメニューの「プログラムとファイルの検索」に
dcomcnfg
と入力して、dcomcnfg.exeを実行。
すると、こんなウィンドウが開きました。




後は…書くのが面倒なので、こちらの素晴らしいページを参考に作業を進める。

つまり、

1)コンポーネントサービス > コンピューター > マイ コンピューター
のプロパティを表示
2)プロパティタブの「COMセキュリティ」を選択
3)起動とアクティブ化のアクセス許可の既定値の編集
4)IUSR_を追加する
追加ボタン > 詳細設定ボタン > 検索ボタン > IUSRを選択してOK連打

といった感じで動きました。

Bookmarkとの連携

ワードをテンプレートの用に使うことが出来ます。
そのときに利用するのが「ブックマーク」という機能。

HTMLのフォーム要素のような存在です。
ブックマークにも名前があるので、名前を使って要素を指定し、要素の値を読み込んだり書き込むことがPHPから出来ます。

便利そうですよね。

サンプルコード

こんなので動きます。


$word = new COM( "Word.Application", NULL, CP_UTF8 ) or die( 'no word!?' );
$word->Visible = 0;
$word->Documents->Open( 'word.doc' );
// show all bookmarks
$num_bookmarks = $word->ActiveDocument->Bookmarks->Count;
for( $i = 1; $i <= $num_bookmarks; $i ++ ) {
    try {
        $mark = $word->ActiveDocument->Bookmarks($i)->Name;
        $wdMark = $word->ActiveDocument->Bookmarks( $mark );
        $range = $wdMark->Range;
        $range->Text = "#{$i}:$mark";
    }
    catch( Exception $e ) {}
}
$word->Documents[1]->SaveAs( 'word_new.doc' );

結構、問題が・・・

実際に動かすと分かりますが、
すべてのブックマークを読み込めませんでした。

また日本語を書き込むと後ろにゴミのようなものが・・・!

そこそこ動きますが、仕事に必要な精度は出せませんでした。

0 件のコメント: