Pythonは様々な業務自動化に利用される大変便利なプログラム言語です。ここではPythonを使ってPDFファイルを自動生成するためのreportlabというライブラリを紹介します。
こんにちは。wat(@watlablog)です。ここでは多くの方に有用なreportlabを使ったPDF自動生成の方法を紹介します!
PDF自動作成における最大のメリット
帳票作成の自動化で業務生産性向上が出来る
PDFとは?
PDF(Portable Document Format)とは、Adobe社が開発したファイル形式の名称で、印刷時と同じ表示を維持できるフォーマットを持つことが特徴です。
MicrosoftのExcelで各種帳票を作成している会社も多いと思いますが、表計算ソフト等では印刷時にレイアウト崩れが起きやすく、思ったような印刷が出来ないと四苦八苦した経験をお持ちの方も多いでしょう(表計算ソフトは計算に使うのが本来の姿なのでそこは致し方ない?)。
また、近年は特に電子化の流れが強いので印刷はあまりしなくなって来ましたが、紙で印刷した時と同等の表示が可能なPDFは世界でもよく使われているファイル形式です。
その他、暗号化や電子署名を利用した改竄検出等のセキュリティ、証拠性の高さも普及を後押ししています。
様々な業務でPDFが使われるが、意外と作成が面倒
見た目的にも機能的にも優れたPDFは当然各種業務(書類管理、取引明細、論文、レポート…)に使われ、業界分野を問いません。
しかしこのPDFは、作成にひと手間いるという若干の面倒事があります。
例えば、Microsoft Office製品で書類を作成してからPDFを作成する時も、原本であるWord、Excel、PowerPointといったファイルは別途保存しておき、さらに「名前を付けて保存」でPDF化する事が多々あります。
その都度、印刷レイアウトを確認したりする部分に時間がかかってしまいます。
PDF自動生成で定型書類の作成は全て自動化可能
未だ人の手が多く介在するPDF作成業務ですが、Pythonでimportして使えるreportlabというライブラリを使うことで、プログラム的にPDFを自動生成することが可能です。
コードでPDFを作成可能ということは、定型の書類であれば変数を設定して自動化出来るということです。
Excel等の表計算ソフトは本来の使い方で有効に活用し、手戻りさせないように書類化はPythonで自動化しましょう。
Python/reportlabでPDFを作成するコード
事前準備
reportlabのインストール
コードを紹介する前に、Windowsであれば以下のコードをコマンドプロンプトに打ち込み実行し、reportlabをインストールしましょう。
1 |
python -m pip install reportlab |
フォントの用意
reportlabでPDFを作成する場合、文字の入力にはフォントファイル(.ttf)が必要です。
そしてフォントには著作権があります。個人で利用するだけでなく、第3者に配布したりWebに公開する資料にはフリーフォントを選択することをオススメします。
今回は源真フォントというフリーフォントを公式ページ(http://jikasei.me/font/genshin/)からダウンロードしました。
ダウンロードしたフォントファイルは沢山ありましたが、使いたいフォントをPythonファイル(.py)があるフォルダに置いておきます。
ここでは以下のように「data」というフォルダを作って、GenShinGothic-Monospace-Medium.tffを中に入れました。
PDFに文字を打つコード
以下にPDFを作成するコードの例を示します(ここでは用紙を作成し、文字を少し打つだけ)。
フォントファイルはregisterFontでパスを指定しています。
canvas.CanvasでPDFファイルの入れ物を作り、setPageSizeで用紙サイズの設定、setFontでフォントのセットを行い、drawStringで実際に文字を記入します。
drawStringの第1、第2引数はそれぞれ横と縦の座標になりますが、用紙の左下が(0,0)です。
途中でフォント設定を変えたい場合はsetFontを再度指定してから再びdrawStringを使うようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
from reportlab.pdfgen import canvas from reportlab.lib.units import mm from reportlab.pdfbase.pdfmetrics import registerFont from reportlab.pdfbase.ttfonts import TTFont # フォントを登録 registerFont(TTFont('GenShinGothic', './data/GenShinGothic-Monospace-Medium.ttf')) file = 'reportlab-test.pdf' # 出力ファイル名を設定 paper = canvas.Canvas(file) # 白紙のキャンバスを用意 paper.saveState() # 初期化 paper.setFont('GenShinGothic', 24) # フォントを設定 # 横wと縦hの用紙サイズを設定 w = 210 * mm h = 297 * mm paper.setPageSize((w, h)) # 用紙のサイズをセット paper.drawString(10, h - 30, # テキストの書き込み 'Hello PDF!') paper.setFont('GenShinGothic', 12) # フォントを設定 paper.drawString(10, h - 60, # テキストの書き込み 'ピーディーエフが作成できました!') paper.save() # PDFを保存 |
import文には多数のライブラリが書かれていますが、今回は短いコードなのでそれぞれ使われている場所のコメントを参照下さい。
以下に実行して作成されたPDFファイルの例を示します。フォント設定が反映されています。
作成されたPDFファイルの例:reportlab-test.pdf
PDF内に画像を埋め込むコード
続いてはPDF内に画像を埋め込んでみましょう。
画像はdrawInlineImageに引数として、画像のパス・位置(横縦)・画像のサイズ(横縦)を与えて埋め込みます。画像は先ほどフォントを入れたフォルダに入れて以下のコードをpaper.save()の前に追記しました。
1 2 3 4 5 6 7 8 |
# 画像を埋め込み(画像ファイルのパス, 横位置, 縦位置, 画像横サイズ, 画像縦サイズ) paper.drawInlineImage('./data/graph01.png', 30*mm, 200*mm, 60*mm, 60*mm) paper.drawString(50*mm, 195*mm, '(a) graph01') # 2つ目の画像を埋め込み(上と同様) paper.drawInlineImage('./data/graph02.png', 110*mm, 200*mm, 60*mm, 60*mm) paper.drawString(130*mm, 195*mm, '(b) graph02') |
以下が実行結果です。画像とキャプションの文字列が追加されました。
(位置合わせは結構難しい)
作成されたPDFファイルの例:reportlab-test2.pdf
改行して書き続けるコード
.showPage()で一度それまでのページ編集を確定させ、新たに要素を追加すると改ページが自動的に成されます。
paper.save()の前に以下のコードを追記して確かめてみます。
1 2 3 4 5 6 |
paper.showPage() # 1ページ目を確定 # ここから2ページ目 paper.setFont('GenShinGothic', 12) # フォントを設定 paper.drawString(10, h - 60, # テキストの書き込み '2ページ目です。') |
以下が実行結果です。2ページ目が作成されました。
作成されたPDFファイルの例:reportlab-test3.pdf
まとめ
本ページではreportlabというライブラリを使用したPythonによるPDF自動作成方法を紹介しました。
業務自動化の領域はプログラムの得意分野です!今後もPDF関連は記事を増やしていきたいのでご期待下さい!