背景と課題
PDFファイル生成の必要性から、まずreportlabを採用しました。しかし、reportlabではPDF内容を1行ずつ描画する必要があり、テーブルの高さと幅の自動調整ができません。その結果、テーブル内容がはみ出してしまい、読体验很差。最终的にpdfkitを採用し、wkhtml2pdf依赖してHTMLファイルをPDFに変換することにしました。
1. wkhtmltopdfバイナリファイルのダウンロード
2. 解凍と環境変数の設定
Dockerfile内でのコマンド例を示します。别的スクリプトの場合はに応じて修改してください。
FROM python:3.6
ENV PYTHONUNBUFFERED 1
WORKDIR /app
COPY . /app
RUN tar vxf /app/static/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz && cp /app/wkhtmltox/bin/wk* /usr/local/bin/
3. 日本語フォントのサポート
Dockerイメージでは、デスクトップOSと異なり、標準で日本語フォントがサポートされていません。PDF生成時に日本語を含める場合、フォントのインストールが必要です。
- デスクトップOSがある場合、wkhtml2pdfは現在のOSのデフォルトフォントを使用します
- デスクトップがない環境では、宋体(SimSun)のみがサポートされるようです
- Windowsシステムからフォントファイルをコピーするか、网络からダウンロードしてください
- フォントキャッシュの生成には、以下の手順を実行します
FROM python:3.6
ENV PYTHONUNBUFFERED 1
WORKDIR /app
COPY . /app
RUN cp /app/static/宋体.ttc /usr/share/fonts/truetype/dejavu && fc-cache -fv
4. pdfkitを使用したHTMLからPDFへの変換
必要なライブラリをインストールします:
pip install pdfkit
変換の使用例:
# HTMLファイルからPDFへの変換
import pdfkit
pdfkit.from_file('test.html', 'test.pdf')
# 文字列からPDFへの変換
import pdfkit
pdfkit.from_string('テスト文字列', 'test.pdf')
Djangoでの使用例:
# ビュー関数での使用
import pdfkit
from django.shortcuts import render
def generate_pdf(request):
context = {'key': 'value'}
rendered = render(request, 'template.html', context)
pdfkit.from_string(rendered.content.decode('utf8'), 'output.pdf')
# テンプレートローダーを使用する場合
import pdfkit
from django.template import loader
def create_pdf():
template = loader.get_template('template.html')
rendered_html = template.render({'key': 'value'})
pdfkit.from_string(rendered_html, 'output.pdf')
以上の手順で、Python Docker環境에서도wkhtml2pdfを使用してHTMLからPDFへの変換が可能になります。