2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have 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"を指定した文字列で置換えるというものです。
応用すると色々便利に使えそうですね!

2
1
0

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
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?