Render HTML to PDF in Django site Render HTML to PDF in Django site python python

Render HTML to PDF in Django site


Try the solution from Reportlab.

Download it and install it as usual with python setup.py install

You will also need to install the following modules: xhtml2pdf, html5lib, pypdf with easy_install.

Here is an usage example:

First define this function:

import cStringIO as StringIOfrom xhtml2pdf import pisafrom django.template.loader import get_templatefrom django.template import Contextfrom django.http import HttpResponsefrom cgi import escapedef 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))

Then you can use it like this:

def myview(request):    #Retrieve data or whatever you need    return render_to_pdf(            'mytemplate.html',            {                'pagesize':'A4',                'mylist': results,            }        )

The template:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html>    <head>        <title>My Title</title>        <style type="text/css">            @page {                size: {{ pagesize }};                margin: 1cm;                @frame footer {                    -pdf-frame-content: footerContent;                    bottom: 0cm;                    margin-left: 9cm;                    margin-right: 9cm;                    height: 1cm;                }            }        </style>    </head>    <body>        <div>            {% for item in mylist %}                RENDER MY CONTENT            {% endfor %}        </div>        <div id="footerContent">            {%block page_foot%}                Page <pdf:pagenumber>            {%endblock%}        </div>    </body></html>

Hope it helps.


Try wkhtmltopdf with either one of the following wrappers

django-wkhtmltopdf or python-pdfkit

This worked great for me,supports javascript and css or anything for that matter which a webkit browser supports.

For more detailed tutorial please see this blog post


https://github.com/nigma/django-easy-pdf

Template:

{% extends "easy_pdf/base.html" %}{% block content %}    <div id="content">        <h1>Hi there!</h1>    </div>{% endblock %}

View:

from easy_pdf.views import PDFTemplateViewclass HelloPDFView(PDFTemplateView):    template_name = "hello.html"

If you want to use django-easy-pdf on Python 3 check the solution suggested here.