Pythonのreportlabの使い方まとめ

# はじめに
この記事ではPythonから帳票等でPDFファイルを出力する際に必要になりそうな書き方をまとめた記事です。

# 開発環境
　Windows10
　Python3.7

# ライブラリのインストール
まずはreportlabをインストールしましょう。

```
pip install reportlab
```

# 空のPDFファイル作成
まずは空のPDFファイルをユーザのデスクトップに作成してみましょう。
下記のプログラムを実行すると空のPDFファイルがデスクトップに作成されます。

```py
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, portrait
import os

# ユーザのデスクトップのディレクトリを取得
file = "sample.pdf"
file_path = os.path.expanduser("~") + "/Desktop/" + file

# A4の新規PDFファイルを作成
page = canvas.Canvas(file_path, pagesize=portrait(A4))

# PDFファイルとして保存
page.save()
```

# フォントの読み込み
文字を書き込むための準備としてフォントファイルの読み込みを行います。
必要なライブラリをインポートしてフォント読み込みのメソッドを呼び出します。
第1引数は読み込み名(任意の名前)、第2引数が対象フォントファイルへのパスです。
下記はWindowsに標準で入っているゴシックと明朝のフォントを読み込むコードです。

```py
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

# フォントの読み込み
pdfmetrics.registerFont(TTFont("HGRGE", "C:/Windows/Fonts/HGRGE.TTC"))
pdfmetrics.registerFont(TTFont("HGRME", "C:/Windows/Fonts/HGRME.TTC"))
```

インストールされているフォントは下記ディレクトリに格納されています。
[C:\Windows\Fonts](C:\Windows\Fonts)

フォントファイル名を参照する場合は右クリックしてプロパティから参照しましょう。
![01_フォント一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175546/25c4bb03-a543-1d50-c07c-fd4b32840959.png)
![02_フォントファイル名.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175546/1b63bb55-47e3-e2d0-971c-4312057701aa.png)



# 文字の書き込み
次に文字を書き込んだPDFを作成していきましょう。
使用するフォントと文字サイズを指定して書き込みます。
文字書き込みのメソッドは3種類あります。
それぞれ第1,2引数がx,y座標、第3引数が書き込み文字列となります。
なお、PDFの場合は**左下が原点(0,0)**となりますので、指定する際は注意してください。

```py
# フォントの設定(第1引数：フォント、第2引数：サイズ)
page.setFont("HGRGE", 20)

# 指定座標が左端となるように文字を挿入
page.drawString(200, 300, "Hello World!")

# 指定座標が中心となるように文字を挿入
page.drawCentredString(200, 200, "Hello World!")

# 指定座標が右端となるように文字を挿入
page.drawRightString(200, 100, "Hello World!")
```

実行結果は下記通りです。

![03_文字列の書き込み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175546/da0de123-c070-774f-788b-6731a04e0b2f.png)

ここまでのソースコードをまとめると下記通りです。

```py
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, portrait
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
import os

# ユーザのデスクトップのディレクトリを取得
file = "sample.pdf"
file_path = os.path.expanduser("~") + "/Desktop/" + file

# A4の新規PDFファイルを作成
page = canvas.Canvas(file_path, pagesize=portrait(A4))

# フォントの読み込み
pdfmetrics.registerFont(TTFont("HGRGE", "C:/Windows/Fonts/HGRGE.TTC"))
pdfmetrics.registerFont(TTFont("HGRME", "C:/Windows/Fonts/HGRME.TTC"))

# フォントの設定(第1引数：フォント、第2引数：サイズ)
page.setFont("HGRGE", 20)

# 指定座標が左端となるように文字を挿入
page.drawString(200, 300, "Hello World!")

# 指定座標が中心となるように文字を挿入
page.drawCentredString(200, 200, "Hello World!")

# 指定座標が右端となるように文字を挿入
page.drawRightString(200, 100, "Hello World!")

# PDFファイルとして保存
page.save()
```

# 画像の挿入
画像を挿入する場合はdrawImage()を使います。
第1引数が画像へのパス、第2,3引数がx,y座標です。

```py
# 挿入したいファイルのパス
img_path = os.path.expanduser("~") + "/Pictures/dog.png"

# 画像ファイルの挿入
page.drawImage(img_path, 200, 500)
```

# 改ページ
1ページ目を書き終えて、2ページ目に移る場合はshowPage()を使用します。
それまでに記述していたページの内容を確定し、メソッド呼び出し以降は次のページの文字等を出力するようになります。
例えば下記のように実行すると1ページ目に「Hello World」と表示し、
2ページ目に「reportlab」と表示します。

```py
page.drawString(200, 300, "Hello World!")

# 改ページ
page.showPage()

page.drawString(200, 300, "reportlab")
```

# 線の描画
線を描画したい場合はline()を使用します。
第1,2引数が始点の座標、第3,4引数が終点の座標です。
始点と終点間を結ぶ線を描画します。

```py
# 線の色の変更(RBGを0～1の少数で指定)
page.setStrokeColorRGB(1.0, 0.0, 1.0)

# 線の太さを変更
page.setLineWidth(3)

# 線の描画
page.line(100, 100, 200, 200)
```

# 四角形の描画
四角形の図形を描画したい場合はrect()を使用します。
第1,2引数が四角形の左下の座標、第3,4引数は幅と高さです。

```py
# 四角形の描画
page.rect(200, 200, 100, 50)

# 塗りつぶした四角形の描画
page.setFillColorRGB(1.0, 0.5, 0.3)
page.rect(300, 300, 100, 50, fill=True)
```

# 最後に
このぐらい使えれば思い通りのPDFが生成できるようになります。