テレワークでペーパーレスの流れが進んでいる。それに伴って資料をPDFで受け渡しする機会も増えている。そこで、PythonのライブラリPyPDF2とReportLabを使って既存PDFに対して文字や図形を書き込む方法を紹介する。二回に分けて紹介するが、今回はライブラリのインストールと簡単な図形の描画までの手順を紹介する。

  • PDFに図形を描画するプログラムを作ってみよう

    PDFに図形を描画するプログラムを作ってみよう

Pythonで自動的にPDFを作成したい

PDFはOSなど環境の差異をそれほど気にせずやりとりできるのが特徴で様々な場面で使われている。そのため、本連載では既にPDFを作成するいくつかの方法を紹介してきた。最初にこれまでに紹介したPDFの作成に関する回を簡単に復習してみよう。

第62回では、ExcelファイルをPDFに変換する方法を紹介した。これはExcelが持つPDF書き出し機能を利用して、Excel操作によってPDFを出力した。

そして、第66回では、HTMLからPDF納品書を作る方法を紹介した。これは、21回目でも紹介したパッケージpdfkitを利用してPDFを生成している。

特に指定の書式がなくゼロからPDFを作るのであればこれらの方法で作るのが簡単だ。ただしこの方法ではHTMLやExcelファイルなどからPDFを作成することができるが、既存PDFの内容を読み込んでPDFに何かを書き加えたりすることはできない。

Python用PDFライブラリ一覧

今回紹介するのは既存のPDFを読み込んでそこに文字や図形を書き込む方法だ。申請書など規定の用紙が用意されており、それに書き込みが必要な場合に使うのがこの方法だ。こうした用途のためにPython用のライブラリがいくつか公開されている。以下にPythonから利用できる有名なライブラリを列挙してみた。

PyPDF2 ... Pythonで実装されたPDFの読み書きライブラリ。PDFのページを分割や結合の機能を持つ。Pythonのみで実装されている。
PyMuPDF ... PDFビュワーMuPDFのPythonバインディング。読み書きの速度が速いのが特徴。
ReportLab ... PDF作成ライブラリ。図形描画や日本語フォントを利用した文字描画にも対応する。
pdfrw ... Pythonの読み書きライブラリ。回転やメタデータの編集などにも対応している。Pythonのみで実装されている。

  • ReportLabのWebサイト

    ReportLabのWebサイト

本稿では利用実績が多いPyPDF2とReportLabを組み合わせて利用してみよう。なぜ二つのライブラリを組み合わせるのかと言えば、PyPDF2は既存のPDFを読み書きする機能のみ持っており文字や図形を書き込む機能を持っていない。

これに対してReportLabは文字や図形を作成することができるがゼロからPDFを作成することしかできない。そのため、これらの二つのライブラリを利用することで、今回の目的とする既存PDFへの書き込みが実現できるというわけだ。

パッケージをインストールしよう

それでは、PyPIからPDFの書き込みに必要となる二つのライブラリをインストールしてみよう。WindowsならPowerShell、macOSならターミナル.appを起動して、以下のコマンドを実行しよう。

pip install pypdf2
pip install reportlab

ゼロから図形を描いたPDFを作ってみよう

最初に、ゼロからPDFを作成するReportLabの使い方を紹介しよう。次のような、矩形、直線、表を描画したPDFを生成する。

  • 簡単な図形をPDFに描画してみたところ

    簡単な図形をPDFに描画してみたところ

以下のプログラムは、この図形を描画するPythonのプログラムだ。

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, portrait
from reportlab.lib.units import inch, mm, cm

# A4縦(210*297mm)のCanvasを準備 -- (*1)
cv = canvas.Canvas('test.pdf', pagesize=portrait(A4))

# 矩形描画 --- (*2)
# PDFの座標を左下が(0, 0)となる
cv.rect(10*mm,250*mm,30*mm,30*mm)

# 線を描画 --- (*3)
cv.line(10*mm,220*mm,200*mm, 220*mm)

# 表を描画 --- (*4)
xlist = (10*mm, 80*mm, 200*mm)
ylist = (200*mm, 170*mm, 140*mm)
cv.grid(xlist, ylist)

# ファイルに保存 --- (*5)
cv.showPage()
cv.save()

上記のプログラムを「test_report.py」という名前で保存しよう。そして、プログラムを実行するには、コマンドライン(WindowsならPowerShell、macOSならターミナル.app)を起動して、以下のコマンドを実行する。

# Windowsの場合
python test_report.py
# macOSの場合
python3 test_report.py

簡単にプログラムを確認しよう。プログラムの(*1)の部分では、PDFを描画する用紙サイズを指定して描画用のCanvasを作成する。ここではA4縦のサイズを指定している。

(*2)の部分ではrectメソッドを利用してCanvasに矩形を描画する。(*3)ではlineメソッドで線を描画し、(*4)ではgridメソッドで表を描画する。そして、(*5)の部分のshowPageメソッドで描画を締めくくり、saveメソッドでファイルへ保存する。

なお、PDFの座標体系は左下が(0,0)となり右上にいくに従って座標が大きくなる。ここで指定されているようにrepotlabを使うとインチ(inch)、ミリ(mm)、センチ(cm)と言った一般的な単位で座標を指定できるようになっている。

  • PDFの座標体系

    PDFの座標体系

オリジナル方眼紙を作ってみよう

簡単なサンプルを見たことで、だいぶReportLabの使い方が分かってきただろうか。それではPythonのfor構文などを利用してオリジナル方眼紙を作ってみよう。以下は12mmの方眼紙を描画するプログラムだ。

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, portrait
from reportlab.lib.units import inch, mm, cm

# A4縦のCanvasを準備 --- (*1)
w, h = portrait(A4)
cv = canvas.Canvas('hougansi.pdf', pagesize=(w, h))
# 方眼紙のマスを計算 --- (*2)
rsize = 12*mm # マスのサイズ
margin_x, margin_y = (10*mm, 10*mm)
count_x = int((w - margin_x*2) / rsize)
count_y = int((h - margin_y*2) / rsize)
top_x = int((w - count_x*rsize) / 2)
top_y = margin_y
bottom_x = top_x + count_x * rsize
bottom_y = top_y + count_y * rsize

# ヘッダに英数文字を描画 --- (*3)
cv.setFont("Times-Roman", 10)
cv.drawString(top_x, bottom_y+5, "A4 Graph Paper 12mm")
# 線の色をRGBで指定 --- (*4)
cv.setStrokeColorRGB(0.4,0.6,0.8)
# 線のサイズを指定
cv.setLineWidth(1)
# 方眼紙の線を描画 --- (*5)
for y in range(count_y+1):
    ry = y * rsize + top_y
    cv.line(top_x, ry, bottom_x, ry)
for x in range(count_x+1):
    rx = x * rsize + top_x
    cv.line(rx, top_y, rx, bottom_y)
# ファイルに保存
cv.showPage()
cv.save()

上記のプログラムを「hougansi.py」という名前で保存したら、以下のコマンドを実行しよう。すると「hougansi.pdf」というPDFファイルが生成される。

# Windowsの場合
python hougansi.py
# macOSの場合
python3 hougansi.py

生成されたPDFを開くと以下のように罫線が描画されている。

  • 作成した方眼紙

    作成した方眼紙

プログラムを確認してみよう。(*1)の部分ではA4縦の用紙サイズのPDFを作成する。(*2)の部分では方眼紙のマスの描画位置や線の本数を計算する。変数rsizeの数値を変更することで、方眼紙のマスのサイズを変更できる。

(*3)ではヘッダに英数文字を描画する。(*4)では線の色や線の太さを指定する。(*5)では実際にlineメソッドを利用して線を描画する。

まとめ

以上、今回はゼロからPDFを作成する方法を紹介した。もちろん、既存のPDFに文字などを書き込むアプリはたくさんあり、ただPDFに何かを書き込みたいだけならば専用のアプリを使う方が簡単だろう。しかし、Pythonを使ってPDFに書き込むなら自動で申請書などのPDFを生成するなど定型処理が自動化できるメリットがある。

なお、今回のプログラムでも、英数字のテキストを描画する方法を紹介しているが、この方法では日本語を描画できない。次回、日本語のテキストをPDFに書き込む方法を紹介する。お楽しみに。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。