テレワークが主流でいろいろな書類をオンラインで発行することが多くなっている。印刷も可能な電子的な書類と言えばPDFだ。ここでは、HTMLファイルからPDFを作成するツール「wkhtmltopdf」を使って、手軽にPDFで納品書を作成してみよう。

  • 名前と値段を入力するとひな形を元にPDFを生成する

    名前と値段を入力するとひな形を元にPDFを生成する

HTMLからPDFを作成する「wkhtmltopdf」を使ってみよう

納品書などの書類を作るにはExcelなどのツールを使うのが一般的だ。ExcelにもPDFファイルも出力する機能が標準でついている。しかし、簡単なツールを利用してPDFを出力できればもっと便利です。プログラムを作って処理の自動化ができる。

しかも、HTMLやCSSなどWebの技術を使ってPDFが出力できるなら、とても都合が良いと言える。というのも、そもそもHTMLはテキストをHTMLタグでタグ付けしただけのテキストファイルだ。つまり、基本的な書類のひな形さえHTMLで用意できたなら、あとは、簡単なプログラムで文字列置換さえすれば、手軽にPDFを出力できるのだ。

HTMLからPDFを作成する「wkhtmltopdf」というツールがある。WebサイトのURLやHTMLを指定すると、PDFファイル(またはPNG画像)でHTMLの画面を出力してくれるものだ。今回は「wkhtmltopdf」を利用して、PDFを生成してみよう。

まずは、『こちら』からwkhtmltopdfをインストールしよう。

  • HTMLからPDFを作成する『wkhtmltopdf』

    HTMLからPDFを作成する『wkhtmltopdf』

wkhtmltopdfの簡単な使い方

それでは、簡単にwkhtmltopdfを使ってみよう。これは、もともとコマンドラインから使うツールだ。WindowsならPowerShellを、macOSならターミナル.appを起動しよう。

そして、以下のコマンドを実行してみよう。コマンドライン引数に指定したURLのWebサイトをPDFで出力する。

# Windowsの場合
cd "(インストールフォルダ)\bin"
.\wkhtmltopdf "https://google.com" "$HOME\Desktop\a.pdf"


# macOSの場合
cd "(インストールフォルダ)/bin"
./wkhtmltopdf "https://google.com" "$HOME/Desktop/a.pdf"

上記のプログラムを実行すると、デスクトップにGoogleのトップページの画面が「a.pdf」という名前で保存される。

  • GoogleのトップページをPDFで保存したところ

    GoogleのトップページをPDFで保存したところ

基本的な使い方は、以下のようになる。コマンドライン引数の変換対象にはURLかファイル名を指定する。

[使い方]
wkhtmltopdf (変換対象のURLかファイル名) (保存先.pdf)

pdfkitをインストールしよう

それでは、ここからPythonのプログラムを作ってみよう。ただし、Pythonからwkhtmltopdfを実行するために「pdfkit」というモジュールを使う。

そこで、コマンドラインから以下のコマンドを実行してpdfkitモジュールをインストールしよう。

pip install pdfkit

ただし、pdfkitを使うためにも、wkhtmltopdfが必要となる。先にwkhtmltopdfをインストールしよう。

領収書のひな形を用意しよう

以下のような納品書のひな形を用意しよう。

  • 納品書のひな形をHTMLで作成したところ

    納品書のひな形をHTMLで作成したところ

このHTMLに対して、日付を表す「__DATE__」や名前「__NAME__」と金額「__PRICE__」の部分を置換すれば、立派な納品書が完成する。

このひな形は、以下のような簡単なHTMLとなっている。「template.html」という名前で保存しよう。

<html><head><meta charset="utf-8"></head><body>
<style>
h1 { text-align: center; padding: 10px;
     background-color:navy; color: white; }
.right { text-align: right; }
.underline { text-decoration: underline; }
th { background-color: navy; color: white;
     padding: 10px;}
td { border-bottom: 1px solid navy; padding: 10px; }
</style>
<p class="right">__DATE__</p>
<h1>納品書</h1>
<p class="right">(株)▲▲▲▲▲▲</p>
<p class="right">Tel: 000-0000-0000</p>
<p class="right">Email: test@example.com</p>
<h3 class="underline">__NAME__ 様</h3>
<p>下記の通り納品いたしました</p>
<table width="100%">
  <tr><th>品名</th><th>数量</th><th>金額</th></tr>
  <tr><td>品物</td><td>1</td><td>__PRICE__</td></tr>
  <tr><td>合計</td><td></td><td>__PRICE__</td></tr>
</table>
</body></html>

pdfkitを使ったPDF生成プログラム

次に、Pythonのプログラムで、名前と金額を入力すると、納品書のPDFを生成するようにしてみよう。「make_receipt.py」という名前で保存する。

import pdfkit, os

# wkhtmltopdfのインストールパスを指定(要書換★) --- (*1)
wkhtmltopdf = r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'

# ファイルのパスを指定
root = os.path.dirname(__file__)
if root == '': root = '.'
template_html = root +'/template.html'
temp_file = root +'/__tmp.html'
output_file = root +'/output.pdf'

# ユーザーに質問する --- (*2)
import tkinter as tk
import tkinter.simpledialog as sd
tk.Tk().withdraw() # ダイアログを使う場合
name = sd.askstring("名前", "名前を入力してください")
price = sd.askstring("値段", "値段を入力してください")

# テンプレートを読む --- (*3)
with open(template_html, 'rt', encoding='utf-8') as fp:
    text = fp.read()
# 日付や名前、金額を置換する --- (*4)
from datetime import datetime
text = text.replace('__DATE__',
    datetime.now().strftime('%Y年%m月%d日'))
text = text.replace('__NAME__', name)
text = text.replace('__PRICE__', price)
# 一時ファイルを出力 --- (*5)
with open(temp_file, 'wt', encoding='utf-8') as fp:
    fp.write(text)

# 変換オプションなどを指定
conf = pdfkit.configuration(wkhtmltopdf=wkhtmltopdf)
options = {'page-size': 'A4', 'encoding': "UTF-8"}

# HTML/CSSファイルをPDF出力 --- (*6)
pdfkit.from_file(temp_file, output_file, options=options, configuration=conf)
print("ok")

そして、コマンドラインで以下のようにプログラムを実行しよう。あるいは、IDLEなどのGUIツールから、Pythonファイルを読み込んで実行することもできるだろう。

cd "プログラムのあるフォルダのパス"
python make_receipt.py

プログラムを実行すると、「output.pdf」という名前でPDFが生成される。

  • ひな形に日付、名前、金額を差し込んでPDFを作成する

    ひな形に日付、名前、金額を差し込んでPDFを作成する

プログラムを確認してみよう。(*1)の部分で、wkhtmltopdfのインストールパスの下にある実行ファイルを指定する。これは、Windowsでデフォルトのフォルダにインストールした場合のパスとなる。実行ファイルのパスを確認して書き換えよう。

(*2)の部分ではダイアログを出して、名前と値段を質問する。(*3)の部分ではテンプレートファイルを読んで、(*4)の部分で日付や名前、金額を置換する。(*5)の部分で一度作業用の一時ファイルに書き出す。そして、(*6)の部分で、wkhtmltopdfを実行して、PDFを出力する。

HTMLからPDF生成のまとめ

以上、今回は、HTMLからPDFが生成できるwkhtmltopdfを使ったプログラムを紹介した。本節で紹介したように、HTMLなら手軽に編集したり文字列置換できるので、手軽にPDFファイルを作成できる。HTML/CSSなどWeb技術が少しでも分かる人なら、ひな形を手軽に編集できるのもメリットの一つだろう。プログラムやテンプレートを編集して活用してみて欲しい。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。