使用 Django 和 Reportlab 从 HTML 生成 PDF
Posted
技术标签:
【中文标题】使用 Django 和 Reportlab 从 HTML 生成 PDF【英文标题】:Generate PDF from HTML using Django and Reportlab 【发布时间】:2015-10-11 03:32:15 【问题描述】:我带着一个无法回答的新问题回来了,一整天都在挠头。
我想通过单击“下载 PDF”按钮从网页生成 PDF。我尝试了几个模块,包括 Reportlab 和 Xhtml2PDF,但我无法生成任何 pdf,也无法下载它...这是我对 Reportlab 所做的,遵循Render HTML to PDF in Django site
--views.py --
import cStringIO as StringIO
import ho.pisa as pisa
from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
from cgi import escape
def index_data(request):
#Code to generate data
return render(request, "analytics/stat.html", locals())
return render_to_pdf(
'analytics/stat.html',
'pagesize':'A4',
'mylist': results,
)
def render_to_pdf(template_src, context_dict):
template = get_template(template_src)
context = Context(context_dict)
html = template.render(context)
result = StringIO.StringIO()
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("ISO-8859-1")), result)
if not pdf.err:
return HttpResponse(result.getvalue(), content_type='application/pdf')
return HttpResponse('We had some errors<pre>%s</pre>' % escape(html))
-- urls.py --
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^$', "analytics.views.main_page", name="main_page"),
url(r'^portail/$', "analytics.views.index_data", name="index"),
url(r'^generate_pdf/$', "analytics.views.GroupPDFGenerate.as_view()", name="generate_pdf")
]
-- 模板分析/stat.html --
% extends "analytics/layout.html" %
% block title %
Audience
% endblock title %
% block head %
# Script to generate google charts
% endblock head %
% block body %
<div class="page-header">
<h1 align="center"> Audience </h1>
</div>
<div class="row">
<div class="col-md-1">
<h3 align="center"><a href="/logout/">Logout</a></h3>
<h3 align="center"><a href="statistiques.pdf">Download pdf</a></h3>
</div>
</div>
% endblock %
另外,有没有更好的模块来处理?
【问题讨论】:
xhtml2pdf
文档现在有一个 example specifically for Django。
【参考方案1】:
2021 年更新:
由于这个答案已有五年多的历史,因此已经出现了一些新的解决方案。这些天来,我倾向于使用 WeasyPrint,它具有获得 BSD 许可而不是 LGPL 的额外好处。但是,它有点慢。
https://weasyprint.org/
原始答案:
我建议使用 wkhtmltopdf。
简短的回答?在 Ubuntu 上,安装二进制文件:
apt-get install wkhtmltopdf
在 CentOS / RedHat 上:
yum install wkhtmltox-0.12.2.1_linux-centos6-amd64.rpm
然后pip安装一个Python包:
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)
关于详细的答案和详细信息,我整理了一篇博文:
https://www.pyphilly.org/generating-pdf-markdown-or-html/
这应该负责 PDF 的创建;您必须决定如何处理下载。祝你好运!
【讨论】:
非常感谢!使用起来似乎很简单!您将如何将代码与 Django 集成?通过视图? 我对 wkhtmltopdf 的一个问题是它需要一个外部二进制文件,这对于部署到 Heroku 等服务是有问题的。 @FlipperPA ... 链接peregrinesalon.com/blog/2015/06/… 不再工作。请更新。 @SharanArumugam 在过去的几年里,我转而使用 Weasyprint,它是 BSD 许可的。 weasyprint.org 感谢 @FlipperPA 的更新,不幸的是,在 Windows 中,我们需要 GTK 运行时才能使用 weasyprint,而这又再次成为 LGPL!【参考方案2】: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'))
【讨论】:
【参考方案3】:如果您说您在生成 PDF 时遇到问题,我建议您先查看我在 this answer 中提到的使用 Reportlab、xhtml2pdf 和 django-easy-pdf 的示例。首先获取要在浏览器中呈现的 PDF,然后继续获取下载链接。
【讨论】:
以上是关于使用 Django 和 Reportlab 从 HTML 生成 PDF的主要内容,如果未能解决你的问题,请参考以下文章
如何将Reportlab与基于Django Class的View相结合?