はじめに
これまで、Ubuntu 12.04を利用して、SDAPSを利用してきましたが、開発者がPPAに最新版を上げたので、Ubuntu 16.04に更新してみました。
2018/03/22 追記
残念ながら、PPAで現在配布されているバージョンでは、レポートで標準偏差が正しく反映されない問題があります。
Githubでの議論やパッチについては、Ubuntu PPAのSDAPSパッケージでレポートの標準偏差がおかしくなる問題への対応にまとめています。
SDAPSはプリンターとスキャナを利用するお手軽なマークシートアプリです。
ただ利用している技術は、LaTeXやPDFなので、日本語を表示するためには欧米仕様のままでは絶対に無理です。フォントの設定などの変更は必須なので、とりあえずad-hocに、いろいろ変更して使えるようにしたので、メモを残しておきます。
環境
本家サイトのTutorialで基本的な操作(コマンドライン)は知っていることを前提としています。
また、LaTeX(setup_tex)の利用が前提で、LibreOfficeを使うODTフォーマットは使っていません。
利用している環境
- Ubuntu 16.04
- sdaps debパッケージ (PPA)
- レーザープリンター (OKI B841)
- ドキュメントスキャナ (Brother ADS-3600W)
ScanSnapとは違い、ADS-3600Wは直接TIFFマルチページ形式でUSBメモリにファイル出力ができるので、とても助かっています。安定して一度に処理できるページ数は40ページ(300dpi,20枚両面)程度という印象です。
debパッケージのインストール
PPAなので、Ubuntu(LTS)では、ドキュメントのとおりにインストールします。
日本語を使うために、xetexも導入します。
$ sudo apt-get install texlive-xetex
変更箇所
きれいな方法ではないですが、パッケージで入れられたファイルをとりあえずは編集しています。
今回は以下のdebパッケージ管理下のファイルを編集しています。
- /usr/lib/python2.7/dist-packages/sdaps/defs.py
- /usr/lib/python2.7/dist-packages/sdaps/reporttex/init.py.20180314
- /usr/lib/python2.7/dist-packages/sdaps/report/buddies.py.20180314
- /usr/lib/python2.7/dist-packages/sdaps/report/answers.py.20180314
- /usr/lib/python2.7/dist-packages/sdaps/template.py.20180314
pdflatexの呼び出しをxelatexに変更
強引ですが、defs.pyのpdflatexコマンドをxelatexに変更しています。
latex_engine = "xelatex"
サンプルを使った質問票LaTeXファイル側の変更について
/usr/share/doc/sdaps/examples/example.tex.gzにあるサンプルに日本語を混ぜてコンパイルするには、最低限、次のような変更が必要です。
--- a.tex 2018-03-14 13:42:18.744530821 +0900
+++ b.tex 2018-03-14 13:19:49.607947987 +0900
@@ -30,7 +30,13 @@
% For demonstration purposes
\usepackage{multicol}
-\author{The Author}
+\usepackage{xltxtra}
+\setmainfont{IPAPMincho}
+\setsansfont{IPAPGothic}
+\setmonofont{IPAGothic}
+\XeTeXlinebreaklocale "ja"
+
+\author{The Author ここに日本語}
\title{The Title}
\begin{document}
以下のページを参考に書き換えました。
この他に、日本で一般的なA4用紙を使う時には、明示的にdocumentclassにa4paperを設定してください。QRコードの読み取りがポイントなので、後で説明するスケーリングしない印刷をするために必要になると思います。
定型文の編集について
Ubuntuのパッケージの問題だと思うのですが、Babelではjapaneseの設定ができないので、Egnlish用のテンプレートファイル、translator-sdaps-dictionary-English.dict、を編集して日本語を組み入れます。
このファイルはsdapsコマンドの引数に指定するディレクトリにコピーされるので、無理にdebパッケージ配下のファイルを編集する必要はありません。
質問票、生成後のレポート出力に必要な変更
前項までの変更でアンケート用の日本語PDFファイルは生成できます。
sdaps reportコマンドはreportlabを利用しているので、変更点はここでのフォント周りです。関連するファイルのdiff出力は次のようになりました。
--- /usr/lib/python2.7/dist-packages/sdaps/template.py.20180314 2015-08-20 15:36:32.000000000 +0900
+++ /usr/lib/python2.7/dist-packages/sdaps/template.py 2018-03-14 14:46:51.793808299 +0900
@@ -25,6 +25,8 @@
"""
from reportlab import platypus
+from reportlab.pdfbase import pdfmetrics
+from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.lib import styles
from reportlab.lib import units
from reportlab.lib import pagesizes
@@ -78,7 +80,8 @@
def beforeDrawPage(self, canvas, document):
canvas.saveState()
- canvas.setFont('Times-Bold', 24)
+ pdfmetrics.registerFont(UnicodeCIDFont("HeiseiKakuGo-W5"))
+ canvas.setFont('HeiseiKakuGo-W5', 24)
canvas.drawCentredString(
document.width / 2.0,
document.height - 50 * mm,
--- /usr/lib/python2.7/dist-packages/sdaps/report/answers.py.20180314 2017-07-17 06:16:41.000000000 +0900
+++ /usr/lib/python2.7/dist-packages/sdaps/report/answers.py 2018-03-14 15:02:32.738665807 +0900
@@ -21,6 +21,8 @@
from reportlab import pdfgen
from reportlab import platypus
+from reportlab.pdfbase import pdfmetrics
+from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.lib import styles
from reportlab.lib import units
from reportlab.lib import pagesizes
@@ -205,7 +207,8 @@
def draw(self):
if 0:
assert isinstance(self.canv, pdfgen.canvas.Canvas)
- self.canv.setFont("Times-Roman", 10)
+ pdfmetrics.registerFont(UnicodeCIDFont("HeiseiKakuGo-W5"))
+ self.canv.setFont("HeiseiKakuGo-W5", 10)
# mean
mean = flowables.Box(self.mean_width, self.mean_height, self.box_depth)
mean.transparent = 0
--- /usr/lib/python2.7/dist-packages/sdaps/report/buddies.py.20180314 2017-07-17 06:16:41.000000000 +0900
+++ /usr/lib/python2.7/dist-packages/sdaps/report/buddies.py 2018-03-14 15:06:34.401587886 +0900
@@ -19,6 +19,8 @@
import math
from reportlab import platypus
+from reportlab.pdfbase import pdfmetrics
+from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.lib import styles
from reportlab.lib import colors
from reportlab.lib import units
@@ -49,11 +51,13 @@
spaceBefore=5 * mm,
)
+pdfmetrics.registerFont(UnicodeCIDFont("HeiseiKakuGo-W5"))
+
stylesheet['Question'] = styles.ParagraphStyle(
'Question',
stylesheet['Normal'],
spaceBefore=3 * mm,
- fontName='Times-Bold',
+ fontName='HeiseiKakuGo-W5',
)
stylesheet['Text'] = styles.ParagraphStyle(
印刷時の不具合の回避
ドキュメントにも載っていますが、QRコードが読めない可能性があるので、日本であれば一般的なA4サイズをTeXファイル上で明示して、特大ページを縮小などのオプションは使わないのがお勧めです。
また読み取りの問題に関連して、コピー機での大量複写もお勧めしません。コストと時間は少しかりますが、経験的にできるだけレーザープリンタで印刷するのが良いと思います。
この他のTips
経験からは、ボールペンやシャープペンシルといった違いは問題になりません。折り目がついたりスキャンしたTIFFファイルを目でみてノイズが目立つと思っても割と処理はスムーズです。
ただTIFFファイルをPDFから変換した場合には、どうやってもうまく処理ができないものが全体の1割ぐらい発生したこともあります。
学生時代はPostscriptファイルの日本語化に悩まされましたが、欧米で開発されたソフトウェアのページ記述言語(PDL)での出力は、いつまでもフォント周りに泣かされるなと感じます。reportlabは優秀だと思いましたが、フォントの指定をしないといけないので、一人の開発者が全てを把握するのは無理だなと思います。
毎年繰り返しアンケートを取っているので、定期的にアンケート用紙のアップデートを行なっています。Ubuntu 12.04では、Version 1.1を使っていたので、今回、Version 1.9に変更になり、choicequestionの引数が**[2]のような表記から、[cols=2]**と変更になったところだけ、昔のファイルを変更して利用しました。
この他の参考文献
以上