人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

[1] ユーザから、ネットでブラウザ経由でWordファイルを受け取り、
[2] そのWord文書の中にある「はてな」という言葉を、自動的にすべて「しなもん」に置換する
方法を教えてください。それに使えるAPIなどはないでしょうか?
できれば無料のものだと嬉しいです。よろしくお願いいたします。

●質問者: lionfan
●カテゴリ:コンピュータ インターネット
✍キーワード:API Word しなもん はてな ネット
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● airlike
●100ポイント

APIは知りませんが、

[1]

・PHP等でファイルを送信できるフォームスクリプト等を使用してサーバーに保存

(フリーのスクリプトでPHPやPerlで添付ファイルを送信できるものがあるので

ネットで検索すれば、すぐに見つかります)

[2]

・Windowsのスケジューラに、wshを定期的に起動

・wshからVBscriptを使って[1]で保存したサーバーにあるファイルにアクセス

・ファイルが存在したら、ダウンロードしてマクロ実行

(マクロで、「はてな」を「しなもん」に変換するものを組んでおく)

・変換をかけたマクロをローカル上に保存

という形でいける気がします。

◎質問者からの返答

airlike様、回答ありがとうございます。下にも書きましたが、すみません、説明不足でした。

自分がやりたいのは、

「ユーザが自分のWord文書をアップロードすると、その直後に、Wordファイル中の『はてな』を『しなもん』に置換したファイルをダウンロードできるようになるサイトを作りたい」

ということです。

で、いま使っているサーバはApatchで、Windows系のサーバ Internet Information Server (IIS)ではない、という制約がついてしまいます。


2 ● ぱこち
●300ポイント ベストアンサー

.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 の方は何だかグダグダになってしまったのですが、ちょっとでも参考になればと思い、残しておきました。

◎質問者からの返答

すばらしい回答ですね!! ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ