Django中HTML内容转换PDF解决方案

一、普通脚本执行方式
在通常情况下将html或者字符串内容转换成PDF,采用Python脚本直接运行可以转换生成。
运行环境:
pip install pdfkit==0.6.1
python = Python 3.6.3
脚本内容如下:
# -*- coding: utf-8 -*-
import pdfkit
def report_to_pdf():
    report ="""<!DOCTYPE html>
                <html><body><div>
                <h1>xxxxx</h1>
                <h5>2018/01/26</h5>
                <div><h2>概况</h2><div>
                <table class="table table-striped table-bordered">
                <thead>
                <tr>
                <th>名称</th>
                <th>xx时间</th>
                <th>xx时间</th>
                <th>本月xx</th>
                <th>本年xx</th>
                <th>xxx</th>
                </tr>
                </thead>
                <tbody>
                <tr>
                <td>xx系统</td>
                <td>0s</td>
                <td>30d</td>
                <td>100.000%</td>
                <td>99.374%</td>
                <td>100.000%</td>
                </tr>
                </tbody></table>
                </div></div></div></body></html>"""
    pdfkit.from_string(report,'./report.pdf')
def report_to_pdf()   #函数调用
以上代码直接可以生成相应的PDF文件

二、Django中url接口调用方式
但是当使用Django POST方式传递参数给view.py,然后view模块中调用模块进行html字符串数据生成PDF文件时出现意想不到的事情:以下是解决方案。
环境要求:
#sudo apt-get install xvfb
#sudo apt-get install wkhtmltopdf
#pip install pdfkit==0.6.1
view模块调用代码如下:
# -*- coding: utf-8 -*-

import pdfkit
def report_to_pdf():
html="""<html><head></head></html>"""
path="文件生成存放路径"
try:
    status=HeadlessPdfKit(html,'string').to_pdf(path)
status_code = 0
return status_code
except Exception as e:
print(e)
return 500

相关错误解决方法:
报错1:前提安装sudo apt-get install xvfb

报错2:无法显示输出
wkhtmltopdf exited with non-zero code -6. error:
QXcbConnection: Could not connect to display

#此方法解决模拟显示问题
class HeadlessPdfKit(pdfkit.PDFKit):
def command(self, path=None):
return ['xvfb-run', '--'] + super().command(path)