Python で PDF を作成する覚書 (CentOS / Docker)

2018-03-21

Python で PDF を作成するには、以下のような手段があるようだ。 (下へ行くほど本命)

● ReportLab

用紙の左下を座標の原点として原始的な方法で描いていく感じ。 (PostScript のような?)

PDFをpythonで生成してみる
PDF生成 (ReportLab) | Python-izm
PythonでPDFを生成したい そしてサイコロを作りたい - [[ともっくす alloc] init]
Django で PDF を出力する | Django documentation | Django
pythonでReportLabを使ったPDFファイルの作り方 - Live the Life you Love
PythonのPDFライブラリ「ReportLab」の使い方(用紙サイズ、向き、文字出力、改ページ) - Symfoware

● Sphinx

TeX を経由して美麗な PDF を作ることも可能らしい。 (TeX がなくても使用可)

SphinxでPDFファイル作成 — Python製ドキュメンテーションビルダー、Sphinxの日本ユーザ会

● wkhtmlttopdf を使った方法

wkhtmlttopdf は、それ単体で HTML から PDF を生成する、コマンドラインのツールである。 (C のライブラリもある)
ライセンスは LGPLv3 である。

Python3でpdfを作る多分一番簡単な方法 - Qiita
Sphinx と ReportLab についても触れられている。
wkhtmltopdf
ここが wkhtmltopdf の本家。

これを Python から操作する便利なラッパーが、いくつか作られている。

◎ python-pdf (pydf)

「suitable for heroku」とは?

python-pdf 0.36 : Python Package Index

◎ python-wkhtmltopdf

Xvfb (X11 の Virtual Frame Buffer というもの) 等のインストールも必要のような..。 Flash にも対応しているらしい。

wkhtmltopdf 0.2 : Python Package Index
GitHub - qoda/python-wkhtmltopdf: A simple python wrapper for the wkhtmltopdf lib.

◎ pdfkit

Ruby にもやはり wkhtmltopdf を使う PDFKit というのがあり、それが元らしい。
MIT ライセンスである。

htmlファイルをpythonでpdfに出力する - Qiita
Windows 8.1 の例。
How to generate PDF Files from HTML In Python using PDFKIT - Micropyramid
wkhtmltopdf のバイナリは wkhtmltopdf のサイトから持ってくる必要があるかもとある。
Ubuntu Server 14.04 LTSでPythonを使ってHTMLからPDFを生成する - えんがわ
Ubuntu の例。 これも wkhtmltopdf は apt-get ではダメとある。
Python3.xでPDFを作成してFlaskで出力する - Life is Really Short, Have Your Life!!
Flask の例がある。
PDFKit generate pdf in python - Stack Overflow
ここにも Flask の例あり。
pdfkit 0.6.1 : Python Package Index
pdfkit の使い方も簡単に書かれている。
apt-get の wkhtmltopdf は機能限定版であり、それに代わり、依存物を apt-get した上、 wkhtmltopdf のサイトからバイナリを持ってくる sh スクリプトが示されている。

● CentOS の Docker コンテナで wkhtmltopdf / pdfkit を使えるようにする

以下に相当する行を Dockerfile に追加した。

RUN yum -y install libXext which ipa-gothic-fonts

RUN curl -L -s -S https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz |\
 xzcat | tar xOf - wkhtmltox/bin/wkhtmltopdf > /usr/local/bin/wkhtmltopdf
RUN chmod +x /usr/local/bin/wkhtmltopdf

Ubuntu 等だと wkhtmltopdf は apt-get では機能限定版しか取得できず wkhtmltopdf のサイトから取得するという話があったが、yum にはどういうわけか wkhtmltopdf がなく、よってどのみち CentOS では wkhtmltopdf のサイトから取得しないといけない。

wkhtmltopdf のサイトの wkhtmltopdf バイナリの tar アーカイブには、オンラインマニュアルや共有ライブラリも含んでいるが、今回は Docker イメージには含めないこととし、また wkhtmltox ディレクトリの下に各種ファイルが配置される構造になっているため、wkhtmltpodf コマンドのみを上記のように取り出し、/usr/local/bin の下 (直下) に置くようにしている。

◎ IPAフォント

フォントについては、IPAフォントを勧めている wkhtmltopdf のページが多かったのでこれを使わせてもらうことにする。
ライセンスは "IPAフォントライセンス" である。 オープンソースライセンスとしての国際的な慣習にも整合性を持つライセンスであるという。
IPAフォントは、IPAの登録商標である。

IPAexフォント/IPAフォント | IPAフォントのダウンロードサイトです

ここでは IPAゴシック (等幅) を用いることにした。

● pdfkit で PDF を作成する例

HTML の文字列から PDF を作成しまるごと返すコードの例を示す。

import pdfkit

def pdf():
    return pdfkit.from_string(
        '<!DOCTYPE html>'
        '<html lang="ja">'
        '<head>'
        '<meta charset="utf-8"/>'
        '<title>もんてい</title>'
        '</head>'
        '<body>'
        '<p>'
        'ぱいそん'
        '</p>'
        '</body>'
        '</html>'.decode('utf-8'),
        False))

.decode('utf-8') がないと環境によっては pdfkit 内部でエラーになる。 unicode(〜, 'utf-8') でも可。

<meta charset="utf-8"/> がないと日本語が文字化けする。

from_string() の第 2 引数に False を指定することにより、PDF の出力先をファイルとするのでなく、戻値として返している。

from_string() の他には、URL から読み込む from_url() や、ファイルから読み込む from_file() がある。

以上


index