Python3 と SlackBotで請求書作成してみた
この投稿はAizu Advent Calendar 2024 1日目の記事です。
明日はアト君です。
みなさんこんにちは。ユオレイです。
今回は、新しく作成した SlackBot を紹介します。
何をつくったか
請求書を作成する SlackBot を作成しました。
GitHub にソースコードも公開していますので、興味があればこちらをご覧ください。

Slack画面
SlackのBotにメンションを送ることで、指定した内容の請求書をPDFで作成してくれる仕組みです。
@請求書bot @kashu 1240 2024/12/01 振込先 ユオレイ銀行ユオレイ支店普通1234567
このような請求書がPDFで作成されます。

請求書PDF
技術スタック
言語
- Python3
PDFを作成するために、最初はGo言語でライブラリを探していましたが、最適なものが見つからず、Pythonで簡単に作成できそうだったため採用しました。
ライブラリ
-
Python Slack SDK
Python Slack SDK を使って、SlackBotを実装しています。 -
ReportLab
ReportLab を使用してPDFを作成しています。
環境
- OS: Ubuntu 22.04
- Python バージョン: 3.10.12
ライブラリインストール
以下のコマンドで必要なライブラリをインストールします。
pip install slack_sdk
pip install reportlab
ReportLab
ReportLab はPythonでPDFを作成するためのライブラリです。
Pythonには他にもPDFを作成するライブラリがありますが、ReportLabが比較的簡単に使えるので採用しました。
以下は、簡単なサンプルコードです。
from reportlab.pdfgen import canvas
# PDFファイルを新規作成
c = canvas.Canvas("sample.pdf")
# テキストを描画
c.drawString(100, 700, "Hello, World!")
c.drawString(0, 0, "Hello2, World!")
# ページを確定し、PDFファイルを保存
c.showPage()
c.save()
drawString(x, y, text)
メソッドは、PDF内の指定された座標 (x, y)
にテキストを描画するために使用します。
上記の例では、ページの左から100ポイント、上から700ポイントの位置に「Hello, World!」を描画し、次にページの左下隅に「Hello2, World!」を描いています。

このように、ReportLabを使って請求書のPDFを作成しています。
請求書の内容
作成した請求書には以下の項目を含めました。
- 請求書というタイトル
- 名前
- 請求金額と下線
- 期限
- 送り主
- 支払い方法を入れる欄
フォーマットとしては最低限のものですが、Slackからの利用を想定しているため、引数が多すぎないようにシンプルに作成しています。 (そもそもチャットボットから請求書を作るべきかどうかは疑問ですが)
PDFのレイアウトは、基本的には位置や文字サイズを調整して仕上げます。
文字サイズの変更方法は以下の通りです。
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, portrait
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
pdfmetrics.registerFont(TTFont('IPAexGothic', '/usr/share/fonts/opentype/ipafont-mincho/ipam.ttf')) #IPAゴシック
# PDFファイルを新規作成
c = canvas.Canvas("invoice.pdf", pagesize=portrait(A4))
width, height = A4
# タイトル: 請求書(中央に配置)
c.setFont("IPAexGothic", 20)
title = "請求書"
title_width = c.stringWidth(title, "IPAexGothic", 20) # 文字列の幅を取得
c.drawString((width - title_width) / 2, height - 50, title) # ページの中央に配置
このコードでは、IPAexGothic フォントを使用し、A4サイズのPDFを作成しています。文字を中央に配置するために、タイトルの幅を計算して中央に配置しています。
文字についてですが drawRightString
を使うと右寄せ、drawCentredString
を使うと中央寄せになります。
下線は簡単に引くことができます。
# ご請求金額の下に下線
c.line(50, height - 185, 200, height - 185)
振込先情報をテーブルで表示するために、以下のコードを使用しています。テーブルの色やフォント、罫線のスタイルもカスタマイズ可能です。
table_width = width - 100
x_offset = 50
y_offset = 350
summary_data_2 = [
[self.payment_method, self.payment_account]
]
summary_table_2 = Table(summary_data_2, colWidths=[150, table_width - 150], rowHeights=45)
summary_table_2.setStyle(TableStyle([
('BACKGROUND', (0, 0), (0, -1), colors.lightblue),
('TEXTCOLOR', (0, 0), (0, 0), colors.black),
('TEXTCOLOR', (1, 0), (1, -1), colors.black),
('ALIGN', (0, 0), (-1, -1), 'LEFT'),
('FONTNAME', (0, 0), (-1, -1), 'IPAexGothic'),
('BOTTOMPADDING', (0, 0), (-1, 0), 10),
('GRID', (0, 0), (-1, -1), 0.5, colors.black),
]))
summary_table_2.wrapOn(c, table_width, height - y_offset - 250)
summary_table_2.drawOn(c, x_offset, height - y_offset - 250)
これで請求書のPDF生成が完了します。
# PDFを保存
c.showPage()
c.save()
これで、PDFファイルが保存されます。
Slack Bot
SlackBotは Python Slack SDK を使って実装しました。 SlackBotの作成には、Slack APIのトークンが必要です。このトークンを使ってメッセージを受け取ったり、ユーザー情報を取得したりできます。メンションも受け取れるように設定しています。
ファイルのアップロードには、files_upload_v2
メソッドを使用しました。
response = self.client.files_upload_v2(
file=invoice_filename,
title=invoice_filename,
channel=channel,
initial_comment=sender_name + "さんが、"+user_id+"さんに請求書を送信しました。"
)
これで、SlackBotによる請求書作成が完了です。
まとめ
今回は Python3 と SlackBot を使用して、請求書を自動で作成するBotを作成しました。 Pythonを使ってPDFを簡単に作成でき、SlackBotとの連携もスムーズに実現できました。 今後は、このBotを AWS Lambda にデプロイして運用することも考えています。
最後まで読んでいただき、ありがとうございました。 Aizu Advent Calendar 2024 の1日目の記事は以上です。今後ともよろしくお願いいたします。