Home‎ > ‎

禁則処理

ReportLabPisa も、特段日本語に興味があるわけでもないので、禁則処理の機能がありません。そこで、自前で禁則処理を行ってみます。


テキストベースの禁則処理

まず、Monospaced フォントで、かついわゆる ASCII キャラクタはいわゆる全角文字に対して半角の幅を持つ文字幅はPythonが持つUnicodeデータベース(unicodedata)が提供するものから定まると想定した上での禁則処理を準備します。- kinsoku-mono.py

ここでは、拗音など(小文字のひらがな・カタカナ)については原則として禁則処理の対象としません。こちらの方が一般的なようです。ただし、オプションで対象に含めることもできるようにしています。また、禁則文字は原則として追い出し処理ですが、オプションでぶら下げ処理もできるようにしています。

現段階では、桁数を計算して行分割をしています。本当は、各文字のグリフの幅を計算して行分割を行う必要があります。また、追い出し処理を行った場合は行末が空いてしまうので適当に文字間を空けて右端揃えもすべきです。欲を言えば、ぶら下げ処理をしたときは逆に文字間を詰めて右端揃えをできるようにしたいところです。

プロポーショナルフォントを意識した禁則処理

次に、プロポーショナルフォントを含む任意のフォントで表示する場合の禁則処理を準備します。この場合、フォント幅を計算する都合上、フォントデータを読むことができることと、使用するフォントの大きさを指定してやる必要があります。また、行の長さ(幅)は桁数ではなくポイント数で与えることになります。 - kinsoku.py

ここでは、フォントデータとして読むことができるのは ReportLab がサポートしている UnicodeCIDFont で扱えるものか、あるいは TrueType フォントということにしています。ただし、TrueType フォントの場合は ReportLab の TTFont がフォントファイルの指定を要求するので、とりあえず Windows または Mac での MS Mincho/PMincho/Gothic/PGothic にのみ対応しています。

ここまでで各行へのテキストデータの分割は終わりました。

右端揃えの処理

行ごとに分割されたテキストデータは、分割・禁則処理のときと同じフォントを用いて実際にレイアウトしていくことになります。追い出し禁則を行った場合は行末に空白ができるので、その空白の幅(=LINEWIDTH-FONT.stringWidth(LINETEXT, FONTSIZE, encoding=ENCODING))を各文字や行中の空白に均等に分散してやれば、右端揃えができるはずです。
ċ
kinsoku-mono.py
(7k)
Hideki HAYASI,
2010/03/12 21:09
ċ
kinsoku.py
(9k)
Hideki HAYASI,
2010/03/12 21:09
Comments