LoginSignup
1

More than 1 year has passed since last update.

PHPからODFドキュメントを書き換えてみた

Posted at

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]

template.png

実行!

form.htmlにアクセスしてファイルをアップロード

image.png

ドキュメントが出力されました

果たして上手く変換できているんでしょうか。

Screenshot from 2020-12-14 00-38-23.png

開いてみる

うまくいきました!

template_out.png

解説

処理内容は簡単。
ODFは各種関連ファイルをZIPとして固めたものです。
そこで、アップロードしたドキュメントをZIPとして開き、アーカイブ内の"content.xml"を指定した文字列で置換えるというものです。
応用すると色々便利に使えそうですね!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1