Moodleの課題のPDF注釈フィードバックで日本語,JPEG,HEICを扱う with unoconv Document Converter

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

この過程にはいくつかの外部プログラム, ライブラリが介在しており, (特に日本語フォントを要する場合は)設定が複雑. 今まで, Moodle.org のフォーラムに記事を投稿してきた.

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

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

この順で, Universal Office Converter (unoconv) - MoodleDocsを参考に, 設定(手順)と確認(test)を示す.

バージョン

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

unoconv のインストール

su
apt install 
apt install libreoffice
chmod 777 /run/user/1000

Moodle>Site Administration>Plugins>Document converters>Unoconv>Path to unoconv document converterに /usr/bin/unoconvと設定.

Document Converter の有効化

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

test

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

afo.pdfが生成できるはず((apt install unoconvだけだと, dependency でlibreoffice-core-noguiがインストールされるが, それだけだと, RuntimeException になる.libreofficeをインストールするとlibreoffice-core-nogui`はアンインストールされる)).

Apache HTTP Server が unoconv を使えるようにする設定

Directory permission

su
mkdir /var/www/.config
chmod 777 /var/www/.config

*1.

test

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

Moodle でPDFの表示を可能にする設定

Ghostscript のインストールが必要十分.

poppler のインストール

su
apt install poppler-utils

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

Moodle の課題でPDF注釈を有効化

そのためには, 事前にシステムパスに ghostscript を指定する必要がある.

Ghostscript のインストール

su
apt install ghostscript

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

test1

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

test2

PDF注釈にチェックした課題で, 学生が英語テキストファイルを提出すると, 教師は評定ページで, PDFに変換されたものが見られるはず.

test3

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

変換を日本語対応にする設定

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

Noto-CJK フォントの導入

su
apt install fonts-noto-cjk

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

su
systemctl restart unoconv

test1

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

test2

日本語テキストファイルも変換されるはず

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

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

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

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

su
vi $(MOODLE)/config.php

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

$CFG->directorypermissions = 0777;
$CFG->pdfexportfont='kozminpromedium';
//$CFG->pdfexportfont='kozminproregular'; // On Ubuntu Server 22.04.3 LTS

拡張子jpegのファイルもunoconvで変換する設定

この段階で, 拡張子 jpg のJPEG形式ファイルはPDFに変換されるが, 拡張子が jpeg だと変換されない.

unoconv の書き換え

su
vi /usr/bin/unoconv

末尾に次を追加

fmts.add('graphics', 'jpg', 'jpg', 'Joint Photographic Experts Group', 'draw_jpg_Export') ### 3
fmts.add('graphics', 'jpg', 'jpeg', 'Joint Photographic Experts Group', 'draw_jpg_Export') ### 3 追加
fmts.add('presentation', 'jpg', 'jpg', 'Joint Photographic Experts Group', 'impress_jpg_Export') ### 19
fmts.add('presentation', 'jpg', 'jpeg', 'Joint Photographic Experts Group', 'impress_jpg_Export') ### 19 追加

test1

unoconv --show

test2

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

この方法でよい理由

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

unoconvは

unoconv -f pdf afo.jpeg

を正しく扱うが, 対応拡張子リストには [.jpeg]が表示されないので, それを追加している.

HEIC 形式のファイルを前処理で JPEG に変換する設定

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

Imagemagick のインストール

su
apt install imagemagick
type -a convert

converter.php の書き換え

  • convert クラスのメソッド 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で変換する.
128c128,145
<             }
---
>             } else { // hig
>                 if( \core_text::strtolower($fromformat) == 'heic'){
>                     $jpgfilename=$uniqdir . '/' . $file->get_id() . '.jpg';
>                     $cmd=escapeshellcmd("/usr/bin/convert"). ' '.
>                         escapeshellarg($filename) . ' '.
>                         escapeshellarg($jpgfilename);
>
>                     $output = null;
>                     $currentdir = getcwd();
>                     chdir($uniqdir);
>
>                     $result = exec($cmd, $output, $returncode);
>                     $filename=$jpgfilename;
>
>                     chdir($currentdir);
>                     touch($filename);
>                 }
>             } // hig

test

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

この方法でよい理由

heic はunoconv --showで表示されないので, Moodleは変換しようとしない. また, 実際 unoconvは HEIC形式ファイルを扱えない.

Imagemagick (convert) は HEIC形式を JPEG形式などに変換できるので, この問題に対処する方法として,

  • unoconv のwrapperを書いて, convert を前処理として呼び出す
  • $(MOODLE)/files/converter/unoconv/classes/converter.php を書き替えて unoconv の前に convert を呼び出すようにする.

の2つが考えられる. ここでは後者を採用した.

他のありうる方法

libheif-examples に含まれる heif-convert も heic を扱えるという.

さらにやってもいいこと

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

*1:Universal Office Converter (unoconv) - MoodleDocsには, Ubuntuの例で別のディレクトリ名が書いてあるが, Debianならたぶんこうだと思う

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