Look on the Bright Side of Things

Anderson's Blog - since 2005

PythonからPDF帳票の出力を試みる

業務用システムには欠かせない、明細一覧表。これを作りたいために社長にパソコンをおねだりした。従来は注文伝票の束をどかっと渡されて、それが自体が作業指示票となっていたのだが、当然ながら伝票を一枚一枚めくって、分類、集計の上、作業段取りを決めることになり、極めて非効率だった。
上長から作業を引き継いだ際、なんでこんな無駄なことに疑問を持たずに何十年も仕事していられるのか、不思議でしょうがなかった。
パソコンを受領したあと、LibreOfficeのBaseでデータベースを構築して、クエリーを作り、それをもとに明細一覧表のレポートを作成して使ってみると、当然のことながら注文の全体が見渡せるようになり、格段に作業しやすくなった。しかし、Baseのレポート作成機能は貧弱で、デザインもしづらく、ストレスが溜まる。それもPythonでシステムを組み直す動機の一つになっている。
Pythonで帳票の出力について調べてみたところ、PDFを作成できるReportLabという無料のPythonライブラリが存在している。ReportLabと連携してGUIで帳票をデザインできる機能は有料で、ン十万もするから、英語マニュアルを解読しながらゴリゴリとコードを書かなければならない。
ReportLabは機能が充実しているようで、マニュアルは微に入り細に入り、130ページ以上もあって、読み込むのが極めて大変。DeepL翻訳を使ってコツコツと和訳マニュアルを作成していたものの、遅々として進まなくて、一旦、断念して他の方法を考えてみる。
そもそもPDFを出力するのは、職場にあるプリンターがネットワークに接続されておらず、USBポートにUSBメモリ直挿ししてやると、PDFを読み込んで印刷できるから。Pythonから直でPDFを生成できれば楽だな、とReportLabを選定したのだけれど、PDF自体出力はPythonでなくても、LibreOfficeでもできる。
というわけで、LibreOffice Calcが読めるファイル上に明細票を作成して、LibreOfficeをPDFジェネレータとして使うのもありだ。
ということでXlsxファイルを操作できる、OpenPyXLライブラリを使ってみたところ、基本部分が2日で完成。超簡単。
wxPython上で条件選択をして、実行をすると、MySQLからデータを引っ張ってきて、OpenPyXLで用意したXlsxファイルに書き込み。あとはPython上でsubprocess.runでコマンドラインからLibreOfficeにPDFを作成するように指示し、最後にPDFビューワーを起動して帳票表示。気楽でいい感じ。
無論、何かと鈍重なLibreOfficeを介さないほうが高速かつシンプルだから、暇ができたらReportLabに再度挑戦してみてもいいかも。