2018-03-21
Python で PDF を作成するには、以下のような手段があるようだ。 (下へ行くほど本命)
用紙の左下を座標の原点として原始的な方法で描いていく感じ。 (PostScript のような?)
TeX を経由して美麗な PDF を作ることも可能らしい。 (TeX がなくても使用可)
wkhtmlttopdf は、それ単体で
HTML から PDF を生成する、コマンドラインのツールである。
(C のライブラリもある)
ライセンスは LGPLv3 である。
これを Python から操作する便利なラッパーが、いくつか作られている。
「suitable for heroku」とは?
Xvfb (X11 の Virtual Frame Buffer というもの) 等のインストールも必要のような..。 Flash にも対応しているらしい。
Ruby にもやはり wkhtmltopdf を使う PDFKit というのがあり、それが元らしい。
MIT ライセンスである。
以下に相当する行を 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フォントを勧めている wkhtmltopdf
のページが多かったのでこれを使わせてもらうことにする。
ライセンスは "IPAフォントライセンス" である。
オープンソースライセンスとしての国際的な慣習にも整合性を持つライセンスであるという。
IPAフォントは、IPAの登録商標である。
ここでは IPAゴシック (等幅) を用いることにした。
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() がある。