PythonのPDF生成ライブラリスイート「reportlab」

reportlab を使って日本語を含む PDF を作る試み。ドキュメントがほとんどないので予想以上に苦労してしまったが、一応日本語なんかが使えるようだ。初めに JavaiText とか作って作ろうかと一瞬思ったが、やめといてよかった〜。

でも、作者がきちんとエンコーディングのセマンティクスを理解していないので無用な変換が必要。もうちょっとコードを読み進めたらパッチをつくってみよう。本来であれば CMap をパースした結果から CID ベースのコーデックを作って、TextObject が作られたらフォント名から自動的に変換をかけるべきなんだけど。

フォント名がHeiseiKakuGoとか決め打ちのものしか指定できないのと、なぜか簡体字中国語のフォントが一覧に入ってないのも気になる。使えるフォントの一覧は以下。

* STSong-Light (繁体字中国語)
* MSung-Light (繁体字中国語)
* HeiseiMin-W3 (日本語)
* HeiseiKakuGo-W5 (日本語)
* HYSMyeongJo-Medium (韓国語)
* HYGothic-Medium (韓国語)

追記: ここにあるように、CIDFont クラスではなく UnicodeCIDFont クラスを使ったところ変換なしでいけましたる場合もありました。

f:id:moriyoshi:20080205193243p:image

# vim: encoding=UTF-8
import os
import codecs
from reportlab.pdfbase import pdfmetrics, cidfonts
from reportlab.pdfgen import canvas
from reportlab.lib.units import cm

pdfmetrics.registerFont(cidfonts.CIDFont('HeiseiKakuGo-W5', '90ms-RKSJ-H'))
pdfmetrics.registerFont(cidfonts.CIDFont('MSung-Light', 'UniCNS-UCS2-H'))

c = canvas.Canvas('hello.pdf')
c.setFont('HeiseiKakuGo-W5-90ms-RKSJ-H', 20);
c.drawString(4*cm, 26*cm, codecs.getencoder('cp932')(u'俺は日本人, and you?'))0]]
c.setFont('MSung-Light-UniCNS-UCS2-H', 20);
c.drawString(4*cm, 22*cm, codecs.getencoder('utf_16')(u'我是日本人、你呢?')[0])
c.showPage()
c.save()