PHPの学習し直しの一貫としてPHPからODFドキュメントの書き換えに挑戦してみました。
#作成したもの
##ドキュメントアップロード用フォーム
form.html
<!DOCTYPE html>
<html lang="ja" dir="ltr">
<head>
<meta charset="utf-8">
<title>てすと</title>
</head>
<body>
てすとです
<form enctype="multipart/form-data" method="post" action="rsv.php">
<input type="file" name="filetest" size="20"/>
<input type="submit" value="送信する">
</form>
</body>
</html>
##ファイル受け取って置換え機能へ渡す
rsv.php
<?php
ini_set('display_errors', "On");
//置換え機能をインクルード
include "libOdfReplace.php";
$uploaddir = "./upload/";
$uploadfile = $uploaddir.basename($_FILES['filetest']['name']);
move_uploaded_file($_FILES['filetest']['tmp_name'],$uploadfile);
//置換え指定を配列に格納
$replaceArray [1]["target"] = "[name]";
$replaceArray [1]["replace"] = "会津太郎";
$replaceArray [2]["target"] = "[address]";
$replaceArray [2]["replace"] = "会津若松市東栄町99-99";
$replaceArray [3]["target"] = "[birthymd]";
$replaceArray [3]["replace"] = "令和2年12月13日";
//置換え機能へドキュメントのパスと置換え指定配列を渡す
$odftext = odf_replace($uploadfile,$replaceArray);
?>
##rsv.phpから渡されたファイル中の所定の文字列を置換え
libOdfReplace.php
<?php
function odf_replace($filename,$replaceArray) {
echo $filename;
$dataFile = "content.xml";
//ZIP archive オブジェクトを作成
$zip = new ZipArchive;
// ドキュメントをアーカイブとして開く
if (true === $zip->open($filename)) {
// アーカイブ内からcontent.xmlのインデックスを取得
if (($index = $zip->locateName($dataFile)) !== false) {
// インデックスからファイルの内容を取得
$text = $zip->getFromIndex($index);
// 指定の文字列の置換え
foreach ($replaceArray as $repkey) {
$text = str_replace($repkey["target"],$repkey["replace"],$text);
}
$zip->deleteIndex($index);
$zip->addFromString($dataFile,$text);
}
//アーカイブを閉じる
$zip->close();
}
}
?>
##元のドキュメント「template.odt」
置換え対象の文字列として以下の3つが挿入されています。
[name]
[address]
[birthymd]
#実行!
##form.htmlにアクセスしてファイルをアップロード
##ドキュメントが出力されました
果たして上手く変換できているんでしょうか。
##開いてみる
うまくいきました!
#解説
処理内容は簡単。
ODFは各種関連ファイルをZIPとして固めたものです。
そこで、アップロードしたドキュメントをZIPとして開き、アーカイブ内の"content.xml"を指定した文字列で置換えるというものです。
応用すると色々便利に使えそうですね!