HTML页面转换成PDF
方法一:
用到的库 参考:http://kaito-kidd.com/2015/03/12/python-html2pdf/
import pdfkit
用法:
pdfkit.url('http://www.baidu.com', 'path/out.pdf')
pdfkit.html('path/test.html', 'path/out.pdf')
pdfkit.string('hello!', 'path/out.pdf') .
|
实例代码:
html = render_template('path.html', items=items)
css = [current_app.root_path + url_for('static', filename='path.css'), current_app.root_path + url_for('static', filename='path.js')]
options = { 'page-size': 'Letter', 'margin-top': '0.25in', 'margin-right': '0.2in', 'margin-bottom': '0.25in', 'margin-left': '0.2in' }
filename = 'path/filename.pdf' pdfkit.from_string(html, filename, css=css, options=options)
|
这个方法比较缺点是,页面渲染很难调,页面样式不兼容,中文乱码等问题。解决中文乱码
不建议在生产环境中使用,有坑。生产环境X server问题
方法二、
xhtml2pdf
官方文档
示例代码:
from xhtml2pdf import pisa
sourceHtml = "<html><body><p>To PDF or not to PDF</p></body></html>" outputFilename = "test.pdf"
def convertHtmlToPdf(sourceHtml, outputFilename): resultFile = open(outputFilename, "w+b")
pisaStatus = pisa.CreatePDF( sourceHtml, dest=resultFile)
resultFile.close()
return pisaStatus.err
if __name__ == "__main__": pisa.showLogging() convertHtmlToPdf(sourceHtml, outputFilename)
|
也可以生成PDF文件不存在本地,直接响应PDF文件,声明application/pdf
文件类型
html = render_template('path/report_detail.html', data=data, font_path='path/msyh.ttf', logo='path/assets/images/logo/dianyi_logo.jpg')
filename = 'report.pdf' result = BytesIO()
pdf = pisa.CreatePDF(BytesIO(html.encode('utf-8')), result, encoding='utf-8') resp = make_response(result.getvalue()) result.close() resp.headers["Content-Disposition"] = (f"inline; filename='{filename}'") resp.headers['Content-Type'] = 'application/pdf' resp.headers['verify'] = 'false' return resp
|