一、普通脚本执行方式
在通常情况下将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)