[1] ユーザから、ネットでブラウザ経由でWordファイルを受け取り、

[2] そのWord文書の中にある「はてな」という言葉を、自動的にすべて「しなもん」に置換する
方法を教えてください。それに使えるAPIなどはないでしょうか?
できれば無料のものだと嬉しいです。よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/07/30 22:43:59
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:pacochi No.2

回答回数247ベストアンサー獲得回数113

ポイント300pt

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

id:lionfan

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

2011/08/02 01:14:28

その他の回答1件)

id:airlike No.1

回答回数51ベストアンサー獲得回数5

ポイント100pt

APIは知りませんが、

[1]

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

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

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

[2]

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

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

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

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

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

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

id:lionfan

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

自分がやりたいのは、

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

ということです。

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

2011/07/26 10:04:01
id:pacochi No.2

回答回数247ベストアンサー獲得回数113ここでベストアンサー

ポイント300pt

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

id:lionfan

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

2011/08/02 01:14:28
  • id:taknt
    普通に置換では ダメなの?

    あと VBAでファイルを開いたときに自動的に置換とか。
  • id:lionfan
    「普通に置換」というのが、「ユーザが手で置換」という意味でしたらダメです。
    ネット上で動くVBAで置換するのはOKです。(ありましたっけ?)

    ただ、ユーザは任意のWordファイルを持ってきますので、そのWordファイルにVBAを埋め込み、ファイルを開いたときに置換、というのは難しいと思います。
  • id:taknt
    ユーザーから wordファイルを 受け取って VBAで実行させれば いいんでしょ?

    wordのテンプレートファイルに VBAを入れておけば どのwordのファイルでも その
    テンプレートが開いてから wordが開くため 受け取ったファイルに VBAが入ってなくても 実行可能です。

    オフィスのバージョンによっては どうかは わかりませんが・・・。
    2007とか2010は わかりません。
  • id:taknt
    受け取ったときに プログラムを実行して 置換でも いいかと思うけど。

    そのプログラムをどこで実行させるのかは わかりませんが。
  • id:lionfan
    taknt様、いつもありがとうございます。すみません、説明不足でした・・・。

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

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

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません