[2] そのWord文書の中にある「はてな」という言葉を、自動的にすべて「しなもん」に置換する
方法を教えてください。それに使えるAPIなどはないでしょうか?
できれば無料のものだと嬉しいです。よろしくお願いいたします。
.doc ファイルは分かりませんが、.docx ファイルは XML なんかが詰まった ZIP ファイルなので、サーバ側で ZIP が扱えるのであれば、何とかなると思います。
Perl なら Archive::Zip モジュール、PHP なら ZipArchive クラスなどを使うと、ZIP の操作ができます。
以下は自分のところで試して置換に成功したスクリプトです。
ただ、サンプルとして調達した Word ファイルがひたすらシンプルだったので、他の Word ファイルではうまくいかなかったりするかもしれません。
アップロードされたファイルをサーバに保存する部分などは省いています。エラー処理なども端折ってます。
<?php hatena2Cinnamon('./hatena.docx'); exit('置換しました。'); # ZipArchive クラスを使う # ZIP サポートが有効じゃないと使えません function hatena2Cinnamon($file) { $zip = new ZipArchive(); $zip->open($file); $XML = $zip->getFromName('word/document.xml'); $XML = str_replace('はてな', 'しなもん', $XML); # タグまたいでも変換できるかも、できないかも #$XML = preg_replace('/は(<[^>]+>|)て(<[^>]+>|)な/', "しなもん$1$2", $XML); $zip->addFromString('word/document.xml', $XML); $zip->close(); } /* # PEAR の File_Archive を使う # セーフモードが有効だと使えません # File_Archive::appender の $stat がちゃんと使えたらセーフモードでもいけるはず function hatena2Cinnamon($file) { require_once('File/Archive.php'); # 作業用ディレクトリ # あらかじめ用意して、ファイル自由に作成できるパーミッションにしておく $tmpDir = './tmp/'; # 一時保存用 zip (File_Archive は拡張子で自動判別する) # 作業用ディレクトリ以外の、自由に作ったり消したりできる場所を指定する $zipFile = './tmp.zip'; # 置換するファイル $docFile = "{$tmpDir}word/document.xml"; rename($file, $zipFile); $src = File_Archive::read("{$zipFile}/"); File_Archive::extract($src, File_Archive::appender($tmpDir)); # docx の中身の更新日時が変なせいでうまく zip ファイルを作れないので変更 $now = time(); while ($src->next()) touch($tmpDir . $src->getFilename(), $now, $now); # 閉じないと上書き保存できない $src->close(); # 作業用ディレクトリから該当ファイル読んで置換 $XML = file_get_contents($docFile); $XML = str_replace('はてな', 'しなもん', $XML); file_put_contents($docFile, $XML); # 作業用ディレクトリ内を zip 化 File_Archive::extract(File_Archive::read($tmpDir), File_Archive::toArchive( # array(9 => time()) は効いてないっぽい $zipFile, File_Archive::toFiles(), 'zip', array(9 => time()) )); rename($zipFile, $file); # 作業用ディレクトリ内全消し system("rm -rf {$tmpDir}*"); } */ ?>
File_Archive の方は何だかグダグダになってしまったのですが、ちょっとでも参考になればと思い、残しておきました。
APIは知りませんが、
[1]
・PHP等でファイルを送信できるフォームスクリプト等を使用してサーバーに保存
(フリーのスクリプトでPHPやPerlで添付ファイルを送信できるものがあるので
ネットで検索すれば、すぐに見つかります)
[2]
・Windowsのスケジューラに、wshを定期的に起動
・wshからVBscriptを使って[1]で保存したサーバーにあるファイルにアクセス
・ファイルが存在したら、ダウンロードしてマクロ実行
(マクロで、「はてな」を「しなもん」に変換するものを組んでおく)
・変換をかけたマクロをローカル上に保存
という形でいける気がします。
airlike様、回答ありがとうございます。下にも書きましたが、すみません、説明不足でした。
自分がやりたいのは、
「ユーザが自分のWord文書をアップロードすると、その直後に、Wordファイル中の『はてな』を『しなもん』に置換したファイルをダウンロードできるようになるサイトを作りたい」
ということです。
で、いま使っているサーバはApatchで、Windows系のサーバ Internet Information Server (IIS)ではない、という制約がついてしまいます。
.doc ファイルは分かりませんが、.docx ファイルは XML なんかが詰まった ZIP ファイルなので、サーバ側で ZIP が扱えるのであれば、何とかなると思います。
Perl なら Archive::Zip モジュール、PHP なら ZipArchive クラスなどを使うと、ZIP の操作ができます。
以下は自分のところで試して置換に成功したスクリプトです。
ただ、サンプルとして調達した Word ファイルがひたすらシンプルだったので、他の Word ファイルではうまくいかなかったりするかもしれません。
アップロードされたファイルをサーバに保存する部分などは省いています。エラー処理なども端折ってます。
<?php hatena2Cinnamon('./hatena.docx'); exit('置換しました。'); # ZipArchive クラスを使う # ZIP サポートが有効じゃないと使えません function hatena2Cinnamon($file) { $zip = new ZipArchive(); $zip->open($file); $XML = $zip->getFromName('word/document.xml'); $XML = str_replace('はてな', 'しなもん', $XML); # タグまたいでも変換できるかも、できないかも #$XML = preg_replace('/は(<[^>]+>|)て(<[^>]+>|)な/', "しなもん$1$2", $XML); $zip->addFromString('word/document.xml', $XML); $zip->close(); } /* # PEAR の File_Archive を使う # セーフモードが有効だと使えません # File_Archive::appender の $stat がちゃんと使えたらセーフモードでもいけるはず function hatena2Cinnamon($file) { require_once('File/Archive.php'); # 作業用ディレクトリ # あらかじめ用意して、ファイル自由に作成できるパーミッションにしておく $tmpDir = './tmp/'; # 一時保存用 zip (File_Archive は拡張子で自動判別する) # 作業用ディレクトリ以外の、自由に作ったり消したりできる場所を指定する $zipFile = './tmp.zip'; # 置換するファイル $docFile = "{$tmpDir}word/document.xml"; rename($file, $zipFile); $src = File_Archive::read("{$zipFile}/"); File_Archive::extract($src, File_Archive::appender($tmpDir)); # docx の中身の更新日時が変なせいでうまく zip ファイルを作れないので変更 $now = time(); while ($src->next()) touch($tmpDir . $src->getFilename(), $now, $now); # 閉じないと上書き保存できない $src->close(); # 作業用ディレクトリから該当ファイル読んで置換 $XML = file_get_contents($docFile); $XML = str_replace('はてな', 'しなもん', $XML); file_put_contents($docFile, $XML); # 作業用ディレクトリ内を zip 化 File_Archive::extract(File_Archive::read($tmpDir), File_Archive::toArchive( # array(9 => time()) は効いてないっぽい $zipFile, File_Archive::toFiles(), 'zip', array(9 => time()) )); rename($zipFile, $file); # 作業用ディレクトリ内全消し system("rm -rf {$tmpDir}*"); } */ ?>
File_Archive の方は何だかグダグダになってしまったのですが、ちょっとでも参考になればと思い、残しておきました。
すばらしい回答ですね!! ありがとうございます。
すばらしい回答ですね!! ありがとうございます。