python - 使用 Django 和 Reportlab 从 HTML 生成 PDF

标签 python django pdf reportlab

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

我想通过单击“下载 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")

]

-- 模板 analytics/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 %}

还有,有没有更好的模块来处理?

最佳答案

2021 年更新:

由于这个答案已经有五年多的历史了,一些新的解决方案已经可用。这些天,我倾向于使用 Wea​​syPrint,它具有获得 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 的创建;您必须决定如何处理下载。祝你好运!

关于python - 使用 Django 和 Reportlab 从 HTML 生成 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31543123/

相关文章:

Excel 在用户表单中加载 PDF

python - 了解递归函数中总值的存储位置 - Python

python - Cython 创建 C 函数别名

python - Django 使用 url 仅获取带有参数的命名 View 的 url 部分

django - 使用 FileField 创建 Django 模型的实例

javascript - 禁用右键单击嵌入元素内的 pdf

python - 使用 numpy 数组计算相似元组的数量

python - Flask、Marshmallow 3 和 webargs use_args 无法解析参数

python - 表 items_item 没有名为category_id 的列

asp.net - 在 ASP.NET 中生成 PDF 文档