Python で Excel を編集し PDF へ変換する

Python で Excel を編集し PDF へ変換します。

とあるサービスの請求業務を Python で自動化できないかなぁ、と思ったのがきっかけです。

  1. Excel で請求書を作成
  2. PDF に変換
  3. メールもしくは郵送で請求書を送付

メール送付まで自動化できそうですが、とりあえず、今回の目標は PDF に変換するところまでです。

Python で Excel を PDF に変換する方法ですが、いろいろ調べてはみたものの、これと言ったベストプラクティスを発見することはできません。しかし、なんとか実現することはできましたので、何かの参考になればと思います。

環境

  • Mac OS X 10.13.6
  • Python 3.5.4
  • OpenPyXL 2.6.1
  • LibreOffice

インストール

Mac に Python3 をインストール

brew install python3

Mac に Python3 をインストールします。Mac はデフォルトで、Python2 がインストールされていますので、Homebrew で Python 3 インストールします。

OpenPyXL のインストール

python -m venv venv
source venv/bin/activate
pip install openpyxl

Python から Excel を操作するために、OpenPyXL をインストールします。

LibreOffice のインストール

brew cask install libreoffice

Excel から PDF へ変換するために、LibreOffice をインストールします。

本当は、Python で実現したかったのですが、実現方法を見つけることができませんでしたので、Python から LibreOffice のコマンド soffice を叩いて、Excel から PDF へ変換しています。

実装

main.py

import datetime
import openpyxl as px
import subprocess as sub

ORG_EXCEL_FILE = 'org_excel_file.xlsx'
EXCEL_FILE = 'excel_file.xlsx'
SHEET_NAME = 'sheet1'

wb = px.load_workbook(ORG_EXCEL_FILE)
ws = wb[SHEET_NAME]
ws['J4'].value = datetime.date.today()  # 請求書発行日
wb.save(EXCELFILE)

cmd = "soffice --headless --convert-to pdf {excel}".format(excel=EXCEL_FILE)
sub.call(cmd.split())

既存の Excel ファイルを読み込み、J4 セルへ請求書発行日を入力し、PDF へ変換します。

ファイル構成

(venv) mac-2:excel-to-pdf satoru$ ls
main.py org_excel_file.xlsx venv
(venv) mac-2:excel-to-pdf satoru$
ファイル構成はこのようになりました。

動作確認

mac-2:excel-to-pdf satoru$ source venv/bin/activate
(venv) mac-2:excel-to-pdf satoru$ python main.py
convert /Users/satoru/workspace/excel-to-pdf/excel_file.xlsx -> /Users/satoru/workspace/excel-to-pdf/excel_file.pdf using filter : calc_pdf_Export
(venv) mac-2:excel-to-pdf satoru$

プログラムを実行すると予定通り、excel_file.pdf という PDF ファイルが作成されました。

しかし、実際に PDF ファイルを開いて中身を確認してみると、いくつか問題がありました。

OpenPyXL が画像ファイルを扱えない

オリジナルの Excel ファイルに、請求書の印鑑を画像で添付していたのですが、OpenPyXL を通すと、画像が消えました。はっきりとした原因はわかっていませんが、どうやら、OpenPyXL は、添付画像をサポートしていない可能性があります。

画像ファイルを利用する場合は、注意が必要があります。

改ページプレビューの印刷範囲で PDF ファイルに変換しない

LibreOffice で PDF ファイルに変換すると、Excel の改ページプレビューの印刷範囲を超えてPDF ファイルに変換されてしまいます。

変換する前に、不要な情報を削除すれば、解決できるでしょう。

まとめ

Python で Excel を編集し PDF へ変換しました。

画像ファイルの問題と印刷範囲の問題がありますので、その辺は今後の課題にしたいと思います。

また、今回は実験だったので、実行環境を Mac にしましたが、本来はサーバサイドで実行したいので、Linux で実装し直す必要があります。利用したパッケージは Linux でも提供があるものなので、おそらく問題ないと思います。さらに、メール送信部分の自動化も今後の課題にしたいと思います。