オープンソースの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')
fmts.add('graphics', 'jpg', 'jpeg', 'Joint Photographic Experts Group', 'draw_jpg_Export')
fmts.add('presentation', 'jpg', 'jpg', 'Joint Photographic Experts Group', 'impress_jpg_Export')
fmts.add('presentation', 'jpg', 'jpeg', 'Joint Photographic Experts Group', 'impress_jpg_Export')
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.という注記が表示される.
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を登録すると, 提出ファイル一覧などで, 画像ファイルのアイコンが表示される.