今回はPythonで日本語フォントをPDFに出力します。ライブラリにはReportLabを利用します。
前回のC#の場合と同じく、真ん中に「こんにちは、世界!」と出力します。ReportLabはPDFを作成するPythonプログラムに古くから利用されています。ライセンスは運用しやすいBSDです。
ライブラリ名 | 今回利用したバージョン | 言語 | ライセンス | レポジトリ |
---|---|---|---|---|
ReportLab | 3.4.0 | Python | BSD | PyPI |
ReportLabは日本語にデフォルトで対応しており、HeiseiMin-W3とHeiseiKakuGo-W5がそのまま使えます。一方、外部ファイルを読み込むことで、任意のTrueTypeフォントを利用することもできます。今回はC#の時と同様に源真ゴシックのTTFファイルを読み込んで使う方法を紹介します。
本記事の目次
使用フォント
日本語のフォントには、フリーの源真ゴシックを用います。源真ゴシックは「源ノ角ゴシック(AdobeがGoogleと共同開発したオープンソースの Pan-CJK フォントファミリー)」を日本語環境で使いやすいように改変したフォントです。実際とても使い勝手がよく、商用利用ができるので重宝します。詳細およびダウンロードは以下のサイトを参照してください。
今回は数種類ある源真ゴシックのフォントファイルのなかから、GenShinGothic-Monospace-Medium.ttf
を用います。
他のよく利用されるフリーフォント
当初はフリーフォントといえば、独立行政法人情報処理推進機構 (IPA) によって配布されているIPAフォント でした。その後、AdobeとGoogleが以下のようなフォントを公開し、さらにライセンスに従った改変と再配布が許容されているので派生フォントも登場しています。今回は、源ノ角ゴシックの派生フォントである「源真ゴシック」を利用させていただきました。
作成するPDF
A4用紙の真ん中に「こんにちは、世界!」と出力するPDFファイルを作成します。
プログラムの作成
プロジェクト構成
プロジェクトは以下の構成で作成します。フォントファイルはfontsフォルダー
にコピーします。
- PdfCreate プロジェクト
- fonts
- GenShinGothic-Monospace-Medium.ttf
- hello_world_pdf.py
ライブラリ(ReportLab)のインストール
pip
を用いてPyPIからReportLabをインストールします。Windowsの場合は、以下のコマンドでPythonランチャー(py
)で実行すれば、利用中の最新のPythonインタプリタにインストールされます。
py -m pip install reportlab
# Pythonランチャーを用いない場合
python -m pip install reportlab
プログラム(hello_world_pdf.py)
ReportLabにはTrueTypeフォントのためにTTFontクラスが用意されています。そのオブジェクトをpdfmetrics.registerFont(obj)
で登録すれば、外部のTrueTypeフォントファイル(*.ttf)を簡単に利用できます。TTFファイルは相対パスで指定できます。
作成したPDFファイルを最後にブラウザーで表示します。Windowsであればos.startfile(FILENAME)
でも表示できます。
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, portrait
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
import webbrowser
# 源真ゴシック( http://jikasei.me/font/genshin/)
GEN_SHIN_GOTHIC_MEDIUM_TTF = "./fonts/GenShinGothic-Monospace-Medium.ttf"
# 白紙をつくる(A4縦)
FILENAME = 'HelloWorld.pdf'
c = canvas.Canvas(FILENAME, pagesize=portrait(A4))
# フォント登録
pdfmetrics.registerFont(TTFont('GenShinGothic', GEN_SHIN_GOTHIC_MEDIUM_TTF))
font_size = 20
c.setFont('GenShinGothic', font_size)
# 真ん中に文字列描画
width, height = A4 # A4用紙のサイズ
c.drawCentredString(width / 2, height / 2 - font_size * 0.4, 'こんにちは、世界!')
# Canvasに書き込み
c.showPage()
# ファイル保存
c.save()
# ブラウザーで表示
webbrowser.open(FILENAME)
文字列の出力には、drawCentredString(x, y, text)
を用います。文字列の下側中央を(x, y)で指定します。文字列のy方向の中心に合わせるために、font_size * 0.4
を差し引いています。0.4をかけているのは経験的な解決法です(時にはこんなアバウトな感覚も必要です…w )。
デフォルトの日本語フォントを用いる方法
前述の通り、ReportLabにはHeiseiMin-W3とHeiseiKakuGo-W5がデフォルトで用意されています。これらを利用するには、以下のコードでフォントを登録します。
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
pdfmetrics.registerFont(UnicodeCIDFont('HeiseiMin-W3'))
canvas.setFont('HeiseiMin-W3', 20)
最後に
前回のC#(ライブラリはPDFSharpを利用)と比較すると、フォントファイルの読み込みと登録がかなりラクです。一方で、文字列の配置については、C#(PDFSharp)の方がすっきりできます。
このように一長一短がありますが、どちらもPDF作成には十分な機能を備えていますので、後は好みの問題です。