PythonでPDFを自動生成したい、でも何から始めればいいか分からない・・・。そんな方におすすめなのが、Pythonの強力なPDFライブラリ「reportlab」です。本記事では、reportlabを使ったPDFの自動生成を、インストールからグラフ描画、セキュリティ設定まで、初心者向けに徹底解説します。Pythonでの帳票自動化を目指すエンジニア必見の内容です!
- reportlabのインストール方法と日本語フォントの設定
- PDFへのテキスト、画像、テーブルの描画方法
- ページ番号・目次の自動追加とテンプレート活用のコツ
- グラフ描画やセキュリティ設定などの高度な機能の使い方
- reportlabを使った業務の自動化・効率化のヒント
reportlabとは?Pythonでの利用メリットを解説
PythonでPDF帳票を自動生成したい、そんな要望にお応えするのがreportlabです。reportlabは、Pythonで最も広く使われているPDF生成ライブラリの1つで、豊富な機能と高い柔軟性を兼ね備えています。
reportlabの概要と特徴
reportlabは、PDFファイルの新規作成はもちろん、既存PDFの読み込みや編集もサポートしています。テキスト、図形、画像などを自在にPDF上に描画できるほか、TrueTypeやOpenTypeなど多様なフォント形式に対応。段組みやテーブル、リストといったレイアウト機能も充実しています。
さらにグラフ、チャート、バーコードの生成機能を標準で備えているのもreportlabの大きな特長です。また、PDF/Aや暗号化など、PDFの高度な機能もサポートされています。
PythonでreportlabによるPDF生成のメリット
reportlabを使えば、手作業でのPDF作成から開放され、業務の自動化・効率化が可能になります。プログラムによる柔軟な制御で、ニーズに合ったPDFを生成できるのも大きなメリットです。Python経験者なら比較的容易に習得・活用できるのも魅力と言えるでしょう。
以下は、reportlabを使ったシンプルなPDF生成のサンプルコードです。
from reportlab.pdfgen import canvas # PDFファイルを新規作成 c = canvas.Canvas("sample.pdf") # テキストを描画 c.drawString(100, 700, "Hello, World!") # ページを確定し、PDFファイルを保存 c.showPage() c.save()
必要なフォントサイズや座標、画像のサイズを指定するだけで、目的のレイアウトが実現できます。
reportlabは日本語にも対応しています。ただし、デフォルトのフォントには日本語グリフが含まれないため、日本語対応フォント(IPAフォントなど)を用意し、PDFに埋め込む必要があります。
このように、reportlabはPythonでのPDF生成に幅広く活用できるライブラリです。それでは、まずはreportlabのインストール方法から見ていきましょう。
reportlabをインストールする方法
それでは、reportlabのインストール方法を見ていきましょう。reportlabは、以下のpipコマンドを実行することで簡単にインストールできます。
pip install reportlabの実行
pip install reportlab
reportlabは、Python 2.7以降、または3.5以降のバージョンで動作しますが、特にPython 3.7以降を推奨とのことです。お使いのPython環境に合わせて、適切なバージョンをインストールしてください。
また、インストール時に以下のようなエラーが発生する場合があります。
- pipコマンドを認識できない→PythonのPathが通っているかを確認しましょう。
- Pillow(PIL)モジュールのインストールエラー→別途Pillowをインストールする必要があります。
日本語フォントのインストールと埋め込み設定
reportlabでは、デフォルトでは日本語フォントが含まれていません。日本語を扱う場合は、以下の手順で日本語フォントをインストールし、PDFに埋め込む設定を行います。
- IPAフォントなどの日本語対応フォントをダウンロードし、任意のフォルダに配置します。
- 以下のようなコードでフォントを登録し、PDFに埋め込みます。
from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont # フォントを登録 pdfmetrics.registerFont(TTFont('IPAGothic', 'ipaexg.ttf')) # フォントを指定してテキストを描画 c.setFont('IPAGothic', 12) c.drawString(100, 500, 'これは日本語テキストの例です。')
ここでは、IPAゴシックフォントを例に説明しましたが、他の日本語フォントでも同様の手順で設定できます。
以下は、日本語フォントの埋め込み設定を含む、より詳細なreportlabのサンプルコードです。
from reportlab.pdfgen import canvas from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from reportlab.lib.pagesizes import A4, portrait from reportlab.lib.units import mm # フォントを登録 pdfmetrics.registerFont(TTFont('IPAGothic', 'ipaexg.ttf')) # PDFを新規作成。用紙サイズを指定 c = canvas.Canvas("japanese_sample.pdf", pagesize=portrait(A4)) # 日本語フォントを指定してテキストを描画 c.setFont('IPAGothic', 12) c.drawString(50*mm, 270*mm, 'これは日本語による描画のテストです。') c.drawString(50*mm, 260*mm, 'フォントサイズを変更したり、') c.setFont('IPAGothic', 16) c.drawString(50*mm, 250*mm, '位置を調整するのも自在です。') # ページを確定し、PDFファイルを保存 c.showPage() c.save()
フォントファイルが見つからないエラーが発生する場合は、フォントファイルのパスが正しいかを確認してください。
以上で、reportlabのインストールと日本語フォントの設定方法についての解説は終わりです。次は、reportlabを使った基本的なPDF生成方法について見ていきましょう。
reportlabによる基本的なPDF生成方法
インストールが完了したら、早速reportlabを使ってPDFファイルを生成してみましょう。ここでは、PDFファイルの新規作成、テキストの描画、画像の埋め込みについて解説します。
PDFファイルの作成とページ追加
PDFファイルを新規作成するには、以下のようにCanvas
クラスのコンストラクタにファイル名を指定します。
from reportlab.pdfgen import canvas # PDFファイルを新規作成 c = canvas.Canvas("sample.pdf") # ページを追加 c.showPage() c.save()
showPage
メソッドでページを確定し、save
メソッドでPDFファイルを保存します。これだけで、空のPDFファイルが生成されます。
文字の描画(フォント、サイズ、色の指定)
PDFにテキストを描画するには、以下のようにします。
# フォントとサイズを指定 c.setFont("Helvetica", 20) # 描画位置を指定してテキストを描画 c.drawString(100, 700, "Hello, World!") # 色を指定してテキストを描画 c.setFillColorRGB(1, 0, 0) # 赤色 c.drawString(100, 650, "This is red text.")
setFont
メソッドでフォントとサイズを指定し、drawString
メソッドで描画位置とテキスト内容を指定して描画します。色を指定する場合は、setFillColorRGB
メソッドを使用します。
画像の埋め込み方法
画像を埋め込むには、以下のようにdrawImage
メソッドを使用します。
# 画像を描画 c.drawImage("python-logo.png", 100, 500, width=100, height=100)
画像ファイル名、描画位置、サイズを指定することで、PDFに画像を埋め込むことができます。
以下は、これらを組み合わせた基本的なPDF生成のサンプルコードです。
from reportlab.pdfgen import canvas # PDFファイルを新規作成 c = canvas.Canvas("sample.pdf") # テキストを描画 c.setFont("Helvetica", 20) c.drawString(100, 700, "Hello, World!") # 色を指定してテキストを描画 c.setFillColorRGB(1, 0, 0) c.drawString(100, 650, "This is red text.") # 画像を描画 c.drawImage("python-logo.png", 100, 500, width=100, height=100) # ページを確定し、PDFファイルを保存 c.showPage() c.save()
このコードを実行すると、以下のようなPDFファイルが生成されます。
- “Hello, World!”というテキストが描画されている。
- “This is red text.”という赤色のテキストが描画されている。
- Python logoの画像が指定のサイズで埋め込まれている。
以上が、reportlabを使った基本的なPDF生成方法です。テキストや画像の配置を調整することで、より複雑なレイアウトも実現できます。
次は、reportlabを使った実用的なPDF自動生成のTipsを見ていきましょう。
reportlabを使った実用的なPDF自動生成Tips
reportlabを使えば、より実用的なPDFの自動生成が可能です。ここでは、テーブルデータの埋め込み、ページ番号の自動追加、目次の自動生成、テンプレートの活用といったTipsを紹介します。
テーブルデータの埋め込み方法
Table
クラスを使うことで、PDFにテーブルを埋め込むことができます。以下は、テーブルデータを埋め込むサンプルコードです。
from reportlab.lib import colors from reportlab.lib.pagesizes import A4 from reportlab.platypus import SimpleDocTemplate, Table, TableStyle # テーブルデータを準備 data = [ ['商品名', '価格', '在庫'], ['商品A', '1000円', '100個'], ['商品B', '2000円', '50個'], ['商品C', '3000円', '30個'], ] # テーブルスタイルを設定 style = TableStyle([ ('BACKGROUND', (0, 0), (-1, 0), colors.grey), ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke), ('ALIGN', (0, 0), (-1, -1), 'CENTER'), ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'), ('FONTSIZE', (0, 0), (-1, 0), 14), ('BOTTOMPADDING', (0, 0), (-1, 0), 12), ('BACKGROUND', (0, 1), (-1, -1), colors.beige), ('TEXTCOLOR', (0, 1), (-1, -1), colors.black), ('ALIGN', (0, 1), (-1, -1), 'LEFT'), ('FONTNAME', (0, 1), (-1, -1), 'Helvetica'), ('FONTSIZE', (0, 1), (-1, -1), 12), ('TOPPADDING', (0, 1), (-1, -1), 6), ('BOTTOMPADDING', (0, 1), (-1, -1), 6), ('GRID', (0, 0), (-1, -1), 1, colors.black), ]) # PDFを生成 def generate_pdf(filename, data): pdf = SimpleDocTemplate(filename, pagesize=A4) table = Table(data) table.setStyle(style) pdf.build([table]) generate_pdf("table.pdf", data)
TableStyle
クラスを使ってテーブルのスタイルを詳細に設定できるのが特徴です。
ページ番号や目次の自動追加
ページ番号は、Canvas
クラスのdrawPageNumber
メソッドを使って自動的に追加できます。
from reportlab.lib.pagesizes import A4 from reportlab.pdfgen import canvas def generate_pdf(filename): pdf = canvas.Canvas(filename, pagesize=A4) # ページ数を取得 page_count = pdf.getPageNumber() for i in range(1, page_count + 1): # ページ番号を描画 pdf.drawPageNumber(550, 20, i, page_count) # 改ページ pdf.showPage() pdf.save() generate_pdf("page_numbers.pdf")
目次は、Paragraph
クラスとPageBreak
クラスを使って自動生成できます。
from reportlab.lib.pagesizes import A4 from reportlab.platypus import SimpleDocTemplate, Paragraph, PageBreak from reportlab.lib.styles import getSampleStyleSheet def generate_pdf(filename, toc_data): pdf = SimpleDocTemplate(filename, pagesize=A4) styles = getSampleStyleSheet() story = [] # 目次を追加 story.append(Paragraph("目次", styles["Heading1"])) for chapter, page in toc_data: story.append(Paragraph(f"{chapter}・・・{page}", styles["Normal"])) story.append(PageBreak()) # 本文を追加 for chapter, page in toc_data: story.append(Paragraph(chapter, styles["Heading2"])) story.append(Paragraph("本文のサンプルテキストです。" * 20, styles["Normal"])) story.append(PageBreak()) pdf.build(story) toc_data = [ ("第1章 はじめに", 1), ("第2章 本論", 2), ("第3章 結論", 4), ] generate_pdf("toc.pdf", toc_data)
テンプレートの活用によるPDF生成の効率化
定型フォーマットのPDFを大量に生成する場合、テンプレートを活用することで効率化できます。
from reportlab.lib.pagesizes import A4 from reportlab.platypus import SimpleDocTemplate, Paragraph from reportlab.lib.styles import getSampleStyleSheet def generate_pdf(filename, template_data): pdf = SimpleDocTemplate(filename, pagesize=A4) styles = getSampleStyleSheet() story = [] # テンプレートを適用 for text in template_data: story.append(Paragraph(text, styles["Normal"])) pdf.build(story) template_data = [ "これは報告書のテンプレートです。", "以下のセクションを記入してください。", "1. はじめに", "2. 調査方法", "3. 結果", "4. 考察", "5. 結論", ] generate_pdf("template.pdf", template_data)
テンプレートとなるテキストデータを用意し、それを元にPDFを生成するだけなので、非常に簡潔に記述できます。
以上のように、reportlabには実用的なPDF生成に役立つ様々な機能が用意されています。他のPDFライブラリと比べても、レイアウトの柔軟性や出力の美しさは特に優れているでしょう。
ただし、一方でreportlabはローレベルなライブラリなので、多少のPythonスキルは必要になります。より簡易に利用したい場合は、reportlabをラップしたものや、他のハイレベルなPDFライブラリの利用も検討してみてください。
次は、reportlabのさらに高度な機能について見ていきましょう。
reportlabのさらに高度な機能の紹介
ここまでは、reportlabの基本的な使い方や実用的なTipsを見てきました。最後に、reportlabのさらに高度な機能について紹介しましょう。
グラフ・チャートの描画方法
reportlabのgraphics
モジュールを使うと、様々なグラフやチャートを描画できます。以下は、棒グラフを描画するサンプルコードです。
from reportlab.graphics.shapes import Drawing from reportlab.graphics.charts.barcharts import VerticalBarChart from reportlab.lib.pagesizes import A4 from reportlab.graphics import renderPDF data = [ (2010, 1000, 1500), (2011, 1500, 1800), (2012, 1800, 2000), (2013, 2000, 2500), ] drawing = Drawing(400, 200) chart = VerticalBarChart() chart.x = 50 chart.y = 50 chart.width = 300 chart.height = 125 chart.data = data chart.valueAxis.valueMin = 0 chart.valueAxis.valueMax = 3000 chart.valueAxis.valueStep = 500 chart.categoryAxis.labels.boxAnchor = 'ne' chart.categoryAxis.labels.dx = 8 chart.categoryAxis.labels.dy = -2 chart.categoryAxis.labels.angle = 30 drawing.add(chart) renderPDF.drawToFile(drawing, "barchart.pdf", "Bar Chart Example")
このように、VerticalBarChart
クラスを使って棒グラフのプロパティを設定し、Drawing
クラスに追加することで、PDFにグラフを描画できます。
暗号化やパスワード保護での高セキュリティPDF生成
canvas.Canvas
クラスのsetEncrypt
メソッドを使うと、暗号化やパスワード保護を設定できます。
from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import A4 def generate_secured_pdf(filename, password): pdf = canvas.Canvas(filename, pagesize=A4) # 暗号化とパスワード保護を設定 pdf.setEncrypt(password) pdf.drawString(100, 500, "This is a secured PDF.") pdf.showPage() pdf.save() generate_secured_pdf("secured.pdf", "password")
機密情報を含むPDFを生成する場合などに活用できるでしょう。
その他、reportlabにはPDF/A準拠のPDF生成、フォームの作成と処理、バーコード・QRコードの生成、PDFの結合・分割、テキスト抽出、注釈の追加など、高度な機能が数多く用意されています。用途に応じて、これらの機能を組み合わせることで、より洗練されたPDFを生成することが可能です。
まとめ:reportlabを使いこなしてPDF自動生成を効率化しよう!
以上、reportlabを使ったPDF自動生成の基本から応用までを見てきました。reportlabは、Pythonでの本格的なPDF生成を実現する強力なライブラリです。基本的な使い方をマスターすれば、高品質なPDFを簡単に自動生成できるでしょう。
実際のビジネスシーンでは、大量の帳票やレポート生成が求められるケースも多いはず。そんな時は、ぜひreportlabの出番です。本記事で紹介したテクニックを応用し、業務の自動化・効率化を図ってみてください。
今回の内容を一通り理解したら、次のステップとしておすすめなのは、実際の業務を想定した、より実践的なPDFの自動生成に挑戦してみることです。サンプルコードを参考に、自社の帳票フォーマットに合わせたPDFの自動出力などに取り組んでみるのはいかがでしょうか。
あなたの創意工夫次第で、reportlabの活用の幅はぐんと広がるはずです。ぜひ、PDF自動生成のスペシャリストを目指して、reportlabを存分に使いこなしてください!
関連リンク
公式ドキュメント
pypdf2
PythonでPDFを操作するライブラリには他にpypdf2があります。合わせてお読みください!
【Python】初心者向けpypdf2の使い方完全ガイド!PDFを自在に操作しよう