We might need to generate a receipt or a report in PDF format in Django app. In this article, we will see how to generate a dynamic PDF from html content and return it as a response.
Create a Django project. If you are not using virtual environment, we strongly recommend to do so.
Django==1.9.7 pdfkit==0.6.1
sudo apt-get install wkhtmltopdf
If its a static PDF, then it is recommended to create it once and upload on the server and provide the direct downloading link.
However if its a dynamic PDF like payment receipt or weekly report, we need to pass the data to template. For this we will use get_template
method of template loader.
For the sake of simplicity, we will pass user's name and date of birth to template. We convert the template to html string with variable values substituted in it and then generate the PDF from html string.
To return PDF as response, set the content_type
as application/pdf
in response.
views.py:
from django.template.loader import get_template import pdfkit from django.http import HttpResponse def index(request): data = dict() data["name"] = "ThePythonDjango.Com" data["DOB"] = "Jan 10, 2015" template = get_template('testapp/test.html') html = template.render(data) pdf = pdfkit.from_string(html, False) filename = "sample_pdf.pdf" response = HttpResponse(pdf, content_type='application/pdf') response['Content-Disposition'] = 'attachment; filename="' + filename + '"' return response
If you hit the URL, file will be downloaded.
pdf_settings = { 'page-size': 'Letter', 'margin-top': '0.75in', 'margin-right': '0.75in', 'margin-bottom': '0.75in', 'margin-left': '0.75in', 'encoding': "UTF-8", 'no-outline': None } pdfkit.from_html(html_text, 'out.pdf', options=pdf_settings)
We can generate PDF from a URL directly, from html or from text using function pdfkit.from_url
, pdfkit.from_html
and pdfkit.from_text
respectively.
Read more about pdfkit here.