关于python docker镜像环境下无法apt安装wkhtml2pdf的解决方案
事情经过:
由于需求需要生成pdf文件,第一种方案是使用reportlab,使用后发现pdf文件内容需要逐行进行内容绘制,最大的问题是表格内容高度和宽度无法进行自适应,导致表格内容溢出,影响阅读体验,故最终选择pdfkit即依赖wkhtml2pdf将html文件生成pdf文件.
1.下载wkhtml2pdf二进制压缩文件
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镜像普遍不支持中文之类的显示或生成,故生成的PDF文件有中文的时候还需要进行字体迁移支持
-
对于带桌面的OS,wkhtml2pdf会以当前OS的默认字体进行输出,对于无桌面环境,查了资料wkhtml2pdf对于中文的支持貌似只支持宋体,有条件的可以进行测试下
-
下载宋体,可以在Windows系统中直接copy字体文件或者从网络上下载宋体文件,然后生成字体缓存
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.此时wkhtml2pdf使用环境已经就绪,可以进行html转换成pdf了
# 普通html文件转pdf使用
import pdfkit
pdfkit.from_file('test.html', 'test.pdf')
# 字符串转pdf使用
import pdfkit
pdfkit.from_string('testjashdjhsahdasjhdijashd', 'test.pdf')
# Django请求视图中使用
import pdfkit
from django.shortcuts import render
data = render(request, '模板.html', {'key': 'value'})
pdfkit.from_string(data.content.decode('utf8'), 'test.pdf')
# Django普通函数调用使用
import pdfkit
from django.template import loader
output = loader.render_to_string('模板.html', {'key': 'value'})
pdfkit.from_string(output, 'test.pdf')