【Python】PDFを新規作成・文字の書き込み・図形の描画をする方法(reportlab)

2020.10.19 /

【Python】PDFを新規作成・文字の書き込み・図形の描画をする方法(reportlab)

仕事をよりスムーズに進めるために、Pythonによる自動化が近年非常に注目されていますよね。

私も仕事で様々な部署向けにPythonで作成した自動化プログラムを配布しています。

エクセルの自動化や、テキストファイルの自動化などPythonで業務効率を改善する方法はたくさんあります。

そしてビジネスではPDFをよく使用しますよね。
そのPDFの作業をPythonで自動化できるようになると、業務効率が改善することは間違いないでしょう。

本記事では、PDFの自動化をするための第一歩、PDFを自動作成し、文字を書き込んだり図形や線を描画する方法を解説します。

また以下リンク先は英語ですが、非常に詳しく今回紹介するreportlabモジュールの使い方を説明しています。
reportlab-userguide

reportlabをインストールする

PDFの作成にはreportlabモジュールを使用します。

Python重要用語

reportlabモジュールは、電子世界の世界標準であるPDFを生成するためのライブラリです

標準ではreportlabモジュールはインストールされていないため、pipコマンドよりインストールする必要があります。

pip install reportlab

サンプルプログラム

まずはサンプルプログラムのソースコードを以下に示します。

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.lib.units import cm
from reportlab.lib.pagesizes import A4, portrait


### PDFファイルを生成する ###
file_name = 'OFFICE54.pdf'    # ファイル名を設定
pdf = canvas.Canvas(file_name, pagesize=portrait(A4))    # PDFを生成、サイズはA4
pdf.saveState()    # セーブ

pdf.setAuthor('OFFICE54')
pdf.setTitle('TEST')
pdf.setSubject('TEST')

### 図形の描画 ###
pdf.setFillColorRGB(54, 54, 0)
pdf.rect(1*cm, 1*cm, 4*cm, 4*cm, stroke=1, fill=1)
pdf.setFillColorRGB(0, 0, 0)

### 線の描画 ###
pdf.setLineWidth(1)
pdf.line(10.5*cm, 27*cm, 10.5*cm, 1*cm)

### フォント、サイズを設定 ###
pdfmetrics.registerFont(UnicodeCIDFont('HeiseiKakuGo-W5'))
pdf.setFont('HeiseiKakuGo-W5', 12)

### 文字を描画 ###
pdf.drawString(1*cm, 26*cm, 'テストテストテストtesttesttest')

pdf.setFont('HeiseiKakuGo-W5', 20)    # フォントサイズの変更
width, height = A4  # A4用紙のサイズ
pdf.drawCentredString(width / 2, height - 2*cm, 'タイトル')

pdf.restoreState()
pdf.save()

このサンプルプログラムにより作成されるPDFは以下のようになります。

Pythonで自動生成したPDF

ソースコード内でPDFを作成するために使用されたreportlabの使い方を詳しく解説していきます。

reportlabモジュールの使用方法

PDFファイルの生成

文字の書き込みなどをする前に、最初に対象のPDFを生成する必要があります。

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, portrait

file_name = 'OFFICE54.pdf'    # ファイル名を設定
pdf = canvas.Canvas(file_name, pagesize=portrait(A4))    # PDFを生成、サイズはA4
pdf.saveState()    # セーブ

ここではファイル名を「OFFICE54.pdf」とし、サイズはA4サイズです。
ちなみにA4サイズは、縦29.7cm、横21.0cmです。

またPDFサイズを指定したい場合は、setPageSizeメソッドを使用します。

pdf.setPageSize((18.2*cm, 25.7*cm))

次にPDFのファイル情報を設定します。
PDFのプロパティから確認できる情報ですね。
このファイル情報に関しては、なくてもPDF生成に問題はないです。

pdf.setAuthor('OFFICE54')    # 作成者情報
pdf.setTitle('TEST')    #タイトル情報
pdf.setSubject('TEST')    #件名情報

文字を書き込む

次に生成したPDFに文字を書き込む方法についてです。

from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.lib.units import cm

### フォント、サイズを設定 ###
pdfmetrics.registerFont(UnicodeCIDFont('HeiseiKakuGo-W5'))
pdf.setFont('HeiseiKakuGo-W5', 12)

### 文字を描画 ###
pdf.drawString(1*cm, 26*cm, 'テストテストテストtesttesttest')

pdf.setFont('HeiseiKakuGo-W5', 20)    # フォントサイズの変更
width, height = A4  # A4用紙のサイズ
pdf.drawCentredString(width / 2, height - 2*cm, 'タイトル')

ここでは文字の描画にdrawStringメソッドを使用しています。

drawString(左からの位置、下からの位置、文字列)

reportlabには日本語フォントとして、「HeiseiMin-W3」と「 HeiseiKakuGo-W5」が用意されています。

線を描画する

線を描画する場合、まず線の太さをsetLineWidthメソッドで指定します。

setLineWidth(線の太さ)

次に線を描画するのにlineメソッドを使用します。
lineメソッドでは線のスタート位置(縦、横)と終了位置(縦、横)を指定する必要があるので、4つの引数を指定します。

line(線のスタート位置縦、横、線の終了位置縦、横)
### 線の描画 ###
pdf.setLineWidth(1)
pdf.line(10*cm, 20*cm, 10*cm, 10*cm)

図形を描画する

図形を描画する場合、最初に色をsetFillColorRGBメソッドで指定します。

図形の描画が終了したら色を元に戻すことを忘れないように。

### 図形の描画 ###
pdf.setFillColorRGB(54, 54, 0)
pdf.rect(1*cm, 1*cm, 4*cm, 4*cm, stroke=1, fill=1)
pdf.setFillColorRGB(0, 0, 0)

サンプルプログラムではrectメソッドを使用していますが、その他にもたくさんの図形を描画するためのメソッドが用意されています。

canvas.grid(xlist, ylist)
canvas.bezier(x1, y1, x2, y2, x3, y3, x4, y4)
canvas.arc(x1, y1, x2, y2)
canvas.ellipse(x1, y1, x2, y2, stroke=1, fill=0)
canvas.wedge(x1, y1, x2, y2, startAng, extent, stroke=1, fill=0)
canvas.circle(x_cen, y_cen, r, stroke=1, fill=0)
canvas.roundRect(x, y, width, height, radius, stroke=1, fill=0)

画像を挿入する

生成したPDFに画像を挿入するには、drawInlineImageメソッドを使用します。
引数には画像のパス・縦横の位置・画像サイズ(縦、横)を指定します。

from reportlab.lib.units import mm
pdf.daraInlineImage(‘OFFICE54.png’, 10*mm, 100*mm, 80*mm, 100*mm)

ページを増やす

PDFを1ページだけでなく、2ページ目、3ページ目も作成したい(改ページ)場合、showPageメソッドを使います。

pdf.showPage()

showPageメソッドを使った時点で、1ページ目は確定され、2ページ目のPDF作成に移ります。

PDFを保存する

サンプルプログラムでは以下の方法でPDFを保存しています。

pdf.restoreState()
pdf.save()

上記以外に改ページで使用したshowPageメソッドでもPDFを保存することができます。

まとめ

PythonでPDFを自動作成する方法はいかがでしたか?

PDFは様々な場面で使用されますので、今回紹介した方法を応用していただいて、仕事に使えるプログラムを作成してみていただければと思います。