今回はPythonで日本語をPDF出力してみます。ライブラリにはReportLabを利用します。

前回のC#の場合と同じく、真ん中に「こんにちは、世界!」と出力します。ReportLabはPDFを作成するPythonプログラムに古くから利用されています。ライセンスは運用しやすいBSDです。

日本語にデフォルトで対応しており、HeiseiMin-W3とHeiseiKakuGo-W5がそのまま使えます。また、外部ファイルを読み込むことで、任意のTrueTypeフォントを利用できます。ここでは前回のC#と同様に、源真ゴシックのTTFファイルを読み込みます。

ライブラリ名 今回利用したバージョン 言語 ライセンス レポジトリ
ReportLab 3.4.0 Python BSD PyPI

使用フォント

日本語のフォントには、フリーの源真ゴシックを用います。源真ゴシックは「源ノ角ゴシック(AdobeがGoogleと共同開発したオープンソースの Pan-CJK フォントファミリー)」を日本語環境で使いやすいように改変したフォントです。実際とても使い勝手がよく、商用利用ができるので重宝します。詳細およびダウンロードは以下のサイトを参照してください。

源真ゴシック(げんしんゴシック)

今回は数種類ある源真ゴシックのフォントファイルのなかから、GenShinGothic-Monospace-Medium.ttfを用います。

他のよく利用されるフリーフォント

当初はフリーフォントといえば、独立行政法人情報処理推進機構 (IPA) によって配布されているIPAフォント でした。その後、AdobeとGoogleが以下のようなフォントを公開し、さらにライセンスに従った改変と再配布が許容されているので派生フォントも登場しています。今回は、源ノ角ゴシックの派生フォントである「源真ゴシック」を利用させていただきました。

出力するPDF

A4用紙の真ん中に「こんにちは、世界!」と出力するPDFファイルを作成します。

hello world!

プログラムの作成

プロジェクト構成

プロジェクトは以下の構成で作成します。フォントファイルは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作成には十分な機能を備えていますので、後は好みの問題です。