Python 使用Django和Reportlab从HTML生成PDF

Python 使用Django和Reportlab从HTML生成PDF,python,django,pdf,reportlab,Python,Django,Pdf,Reportlab,我带着一个新问题回来了,这个问题我一整天都在挠头,无法回答 我想通过点击“下载PDF”按钮从网页生成PDF。我尝试了几个模块,包括Reportlab和XHTML2PDF,但我无法生成任何pdf,也无法下载它。。。以下是我对Reportlab所做的操作 --views.py-- ] --模板分析/stat.html-- {%extends“analytics/layout.html”%} {%block title%} 观众 {%endblock title%} {%block head%} #生

我带着一个新问题回来了,这个问题我一整天都在挠头,无法回答

我想通过点击“下载PDF”按钮从网页生成PDF。我尝试了几个模块,包括Reportlab和XHTML2PDF,但我无法生成任何pdf,也无法下载它。。。以下是我对Reportlab所做的操作

--views.py--

]

--模板分析/stat.html--

{%extends“analytics/layout.html”%}
{%block title%}
观众
{%endblock title%}
{%block head%}
#生成谷歌图表的脚本
{%endblock头%}
{%block body%}
观众
{%endblock%}
此外,是否有更好的模块可供处理?

2021年更新: 由于这个答案已有五年多的历史,一些新的解决方案已经面世。现在,我倾向于使用WeasyPrint,它的另一个好处是获得BSD许可而不是LGPL。不过,速度稍微慢了一点


原始答复: 我建议使用wkhtmltopdf

简单的答案是什么?在Ubuntu上,安装二进制文件:

yum install wkhtmltox-0.12.2.1_linux-centos6-amd64.rpm
在CentOS/RedHat:

pip install pdfkit
然后pip安装一个Python包:

import pdfkit
 
input_filename = 'README.html'
output_filename = 'README.pdf'
 
with open(input_filename, 'r') as f:
    html_text = f.read()
 
pdfkit.from_string(html_text, output_filename)
然后代码:

from easy_pdf.rendering import render_to_pdf

def pdf(request):
    with open('example.pdf', 'wb') as f2:
        f2.write(render_to_pdf('you template', {'user': request.user}, encoding=u'utf-8'))
关于详细的答案,我写了一篇博文:


这应该考虑PDF的创建;您必须决定如何处理下载。祝你好运

如果您说您甚至在生成PDF时都遇到了问题,我建议您首先查看一下我在中提到的使用Reportlab、xhtml2pdf和django easy PDF的示例。首先获取要在浏览器中呈现的PDF,然后获取下载链接。

非常感谢!使用起来似乎很简单!如何将代码与Django集成?通过视图?我对wkhtmltopdf的一个问题是,它需要一个外部二进制文件,这对于部署到Heroku等服务是有问题的。@FlipperPA。。。链接不再工作。请更新。@Sharanarumgam在过去的几年里,我改用了BSD许可的Weasyprint。感谢@FlipperPA的更新,不幸的是,在windows中,我们需要GTK运行时来使用weasyprint,而这又是一个LGPL<代码>xhtml2pdf文档现在有一个。
yum install wkhtmltox-0.12.2.1_linux-centos6-amd64.rpm
pip install pdfkit
import pdfkit
 
input_filename = 'README.html'
output_filename = 'README.pdf'
 
with open(input_filename, 'r') as f:
    html_text = f.read()
 
pdfkit.from_string(html_text, output_filename)
from easy_pdf.rendering import render_to_pdf

def pdf(request):
    with open('example.pdf', 'wb') as f2:
        f2.write(render_to_pdf('you template', {'user': request.user}, encoding=u'utf-8'))