Moodle 4.1 LTSの課題フィードバックPDF注釈のための unoconv Document Converter の設定(含む日本語サポート)

オープンソースのLMSであるMoodleには, 学生がファイルを提出する課題 Assignment 活動がある. PDF注釈Annotate PDFによるフィードバックでは, そのファイルが一律にPDFに変換されて評定ページで教師に提示され, 教師はPDF注釈を加えて学生に返すことができる.

この過程にはいくつかの外部プログラム, ライブラリが介在しており, (特に日本語やHEICフォーマットをサポートする場合は)設定が複雑なのでこの記事で解説.

今まで, Moodle.org のフォーラムに記事を投稿してきた.

この記事は hig3.hatenadiary.com の,最近のバージョンに対する更新.主に MoodleUbuntu の改善により手順が簡単になっている.

バージョン

流れ

PDF注釈は次のように進む.

  • 学生が課題に提出したファイルがPDFならそのまま,PDF以外なら unoconv がPDFに変換する
  • PDFは評定ページで ghostscript や pdftopnm によって表示される
  • 評定ページで教師がPDFに書き込む操作をすると, tfpdf がPDF注釈が加える*1

この順で, 設定(手順)と確認(test)を示す.

PDFを表示する設定(PDF注釈を使用する設定)

Ghostscript のインストール

sudo apt install ghostscript

Moodle>Site Administration>Server>System paths>Path to ghostscript に /usr/bin/gsと設定.

test0

Moodle の課題でPDF注釈によるフィードバックを有効化できる

test1

Moodle > Site Administration >Plugins>Annotate PDF >Path to Ghostscript で, Test Ghostscript path でスタンプにより注釈された画像が表示される

test2

学生が課題にPDFをアップロードし,教師が評定を開くと,PDF注釈のページが表示される.この段階で日本語も表示される.

poppler-utils のインストール(optional)

PDFのWebページ上の表示(のみ,注釈とは無関係)が高速化される.

sudo apt install poppler-utils

Moodle>Site Administration>Server>System paths>Path to pdftoppm に /usr/bin/pdftoppmと設定*2.

提出ファイルのPDFへの変換を可能にする設定

unoconv のインストール

Universal Office Converter (unoconv) - MoodleDocsの手順の通り行う.

test

unoconv --version
echo hello > afo.txt
unoconv -f pdf afo.txt

Python 3.12でdeprecate…のような警告がでるが,放置してかまわないようだ.

Document Converter の有効化

Moodle>Site Administration>Plugin>Document converfters>Manage document converter で Unoconv を有効化, Google Drive など他のConverterより上位に置く.

test1

Moodle>Site Administration/Plugins/Unoconv で, Test unoconv path, Download the converted pdf test file でPDFファイルがダウンロードできるはず.

test2

PDF注釈を有効化した課題に afo.txt をアップロードすると,PDFに変換されたものが評定ページで表示される

提出ファイルのPDFへの変換を日本語対応にする設定

この段階で日本語テキストファイルを提出すると, PDFでは日本語部分が豆腐になる. そこで, unoconv に日本語フォントを与える.

Noto-CJK フォントの導入

sudo apt install fonts-noto-cjk fonts-noto-cjk-extra

unoconv を service にしている場合は service を再起動する

sudo systemctl restart unoconv

test1

echo 日本語 > foo.txt
unoconv -f pdf foo.txt

test2

課題にアップロードした日本語テキストファイルも変換される

変換されたPDFへの注釈を可能にする

PDF注釈

この状態でできるはず.

test1

Moodle > Site Administration >Plugins>Annotate PDF >Path to Ghostscript で, Test Ghostscript path でスタンプにより注釈された画像が表示される

test2

PDF注釈で, ツール群がPDF表示の上に現れ, テキストツールで英語を書き込み, Download feedback PDFで, その内容が書かれたPDFファイルがダウンロードできる.

日本語によるPDF注釈を可能にする設定

この段階では, 注釈でつけた日本語のノートはPDF注釈後に豆腐になる. これを防ぐには, Moodle, tfpdf に日本語フォントを与える必要がある.

sudo vi $(MOODLE)/config.php

で tfpdf の持っているフォントを指定する.

$CFG->directorypermissions = 0777;
$CFG->pdfexportfont='kozminproregular'; 
//$CFG->pdfexportfont='kozminpromedium'; // On Debian?

HEIC 形式のファイルもPDFに変換する設定

HEICはiOSバイスが使う高圧縮な画像フォーマット. この段階では, 拡張子.heicのHEIC形式ファイルを課題に提出すると, PDF注釈ページではPDFに変換されず, Some of the files can only be accessed through download.という注記が表示される.

そこで,HEICからjpegへの変換をサポートする ImageMagick または libheif で前処理する導入する

Imagemagick のインストール

sudo apt install imagemagick
type -a convert

libheif のインストール

sudo apt install libheif-examples
type -a heif-convert

test

scp somewhere:iPhone/photo.heic .
convert photo.heic photo.jpeg

converter.php の書き換え

  • $(MOODLE)/files/converter/unoconv/classes/converter.phpで定義される converter クラスのメソッド protected static function fetch_supported_formats() が返す拡張子の配列に, 要素 'heic' を追加する.
388c405
<             self::$formats = array_unique($formats);
---
>             self::$formats = array_unique(array_merge($formats,['heic']));
  • convertクラスのメソッド public function start_document_conversion(\core_files\conversion $conversion) で, 作業ディレクトリへの提出ファイルのコピーが終わった後, 拡張子が 'heic'である場合のみ, /usr/bin/convert でJPEG形式に変換する前処理を追加し, その後,JPEGをunoconvがPDFに変換するようにする
128c128,145
<             }
---
>             } else { // hig
>                 if( \core_text::strtolower($fromformat) == 'heic'){
>                     $jpgfilename=$uniqdir . '/' . $file->get_id() . '.jpg';
>                     $cmd=escapeshellcmd("/usr/bin/convert"). ' '.
>//                   $cmd=escapeshellcmd("/usr/bin/heif-convert"). ' '.
>                         escapeshellarg($filename) . ' '.
>                         escapeshellarg($jpgfilename);
>
>                     $output = null;
>                     $currentdir = getcwd();
>                     chdir($uniqdir);
>
>                     $result = exec($cmd, $output, $returncode);
>                     $filename=$jpgfilename;
>
>                     chdir($currentdir);
>                     touch($filename);
>                 }
>             } // hig

このファイル converter.php は,Moodle 4.0 から変わっていなかった.

test

課題に拡張子 .heic のHEIC形式ファイルを提出すると, PDFに変換され,評定ページで表示される.

この方法でよい理由

クラスメソッドpublic static function supports($from, $to) で, unoconv が拡張子$fromから$toへの変換をサポートしているかを判定している. このメソッドは結局, unoconv --show で出力される, 対応拡張子リストを参照している.

これにはHEICは含まれないので, Moodleは変換しようとしない. また, 実際 unoconvは HEIC形式ファイルを扱えない. Imagemagick (convert) は HEIC形式を JPEG形式などに変換できるので, unoconv の前に convert で前処理することにした.

さらにやってもいいHEIC対応

Moodle > Site administration > Server > File types でHEICを登録すると, 提出ファイル一覧などで, 画像ファイルのアイコンが表示される.

*1:Moodleについてくる tFPDF により行われる. PHPファイルとしては($MOODLE)/mod/assign/feedback/editpdf/fpdi/Tfpdf あたり

*2:なければghostscriptにfallbackする