Ubuntu 16.04でのsdapsによる日本語アンケートとレポート

# はじめに

これまで、Ubuntu 12.04を利用して、SDAPSを利用してきましたが、開発者がPPAに最新版を上げたので、Ubuntu 16.04に更新してみました。

> 2018/03/22 追記
> 残念ながら、PPAで現在配布されているバージョンでは、レポートで標準偏差が正しく反映されない問題があります。
> Githubでの議論やパッチについては、[Ubuntu PPAのSDAPSパッケージでレポートの標準偏差がおかしくなる問題への対応](https://qiita.com/YasuhiroABE/items/c2ef7b29334be7413122)にまとめています。

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)では、ドキュメントのとおりにインストールします。

* [SDAPS PPA Repository (16.04)](https://launchpad.net/~benjamin-sipsolutions/+archive/ubuntu/sdaps?field.series_filter=xenial)

日本語を使うために、xetexも導入します。

```bash
$ 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に変更しています。

```python:/usr/lib/python2.7/dist-packages/sdaps/defs.py
latex_engine = "xelatex"
```

## サンプルを使った質問票LaTeXファイル側の変更について

*/usr/share/doc/sdaps/examples/example.tex.gz*にあるサンプルに日本語を混ぜてコンパイルするには、最低限、次のような変更が必要です。

```diff
--- 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}
```

以下のページを参考に書き換えました。

* [xeLaTex Japanese Example](https://gist.github.com/bellbind/664195)

この他に、日本で一般的なA4用紙を使う時には、明示的にdocumentclassにa4paperを設定してください。QRコードの読み取りがポイントなので、後で説明するスケーリングしない印刷をするために必要になると思います。

## 定型文の編集について

Ubuntuのパッケージの問題だと思うのですが、Babelではjapaneseの設定ができないので、Egnlish用のテンプレートファイル、*translator-sdaps-dictionary-English.dict*、を編集して日本語を組み入れます。

このファイルはsdapsコマンドの引数に指定するディレクトリにコピーされるので、無理にdebパッケージ配下のファイルを編集する必要はありません。

# 質問票、生成後のレポート出力に必要な変更

前項までの変更でアンケート用の日本語PDFファイルは生成できます。

sdaps reportコマンドはreportlabを利用しているので、変更点はここでのフォント周りです。関連するファイルのdiff出力は次のようになりました。

```diff:template.py
--- /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,
```

```diff:answers.py
--- /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
```


```diff:buddies.py
--- /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]**と変更になったところだけ、昔のファイルを変更して利用しました。

# この他の参考文献
* [SDAPS Official Web Site](https://sdaps.org/)
* [メーリングリスト上でのXeLaTexを使いたいという質問に対する回答](https://sdaps.org/archive/msg00335.html)

以上