Создание PDF в Django с помощью WeasyPrint

Создание PDF в Django с помощью WeasyPrint
В создании pdf файлов в Django очень помогает библиотека WeasyPrint. Сегодня мы рассмотрим пример работы с ней.

WeasyPrint это движок для обработки HTML и CSS, которые выгружаются в формат PDF. Он поддерживает современные стандарты печати, бесплатный и распространяется под лицензией BSD.

Установка

pip install WeasyPrint
Для демонстрации возможностей библиотеки, создадим модель people с тремя полями (name, surname и email). А затем мы выведем документ pdf с таблицей, в которой выведем данные всех people с их данными. Приступим!

1. Создадим простенькое представление для вывода и создания http ответа в views.py:

# -*- coding: utf-8 -*-
from .models import Person
from django.http import HttpResponse
from django.template.loader import render_to_string
from weasyprint import HTML
import tempfile

def generate_pdf(request):
"""Создание pdf."""
# Данные модели
people = Person.objects.all().order_by('last_name')

# Обработка шаблона
html_string = render_to_string('bedjango/pdf.html', {'people': people})
html = HTML(string=html_string)
result = html.write_pdf()

# Создание http ответа
response = HttpResponse(content_type='application/pdf;')
response['Content-Disposition'] = 'inline; filename=list_people.pdf'
response['Content-Transfer-Encoding'] = 'binary'
with tempfile.NamedTemporaryFile(delete=True) as output:
output.write(result)
output.flush()
output = open(output.name, 'r')
response.write(output.read())

return response
2. Добавим новый url в urls.py для привязки нового представления, которое сгенерирует pdf:

from django.conf.urls import url
from . import views

urlpatterns = [
url(r'^generate/pdf/$', views.generate_pdf, name='generate_pdf'),
]

3. Теперь создадим html шаблон, чтобы передать разметку и оформление в pdf. Большой плюс этой библиотеки как раз в том, что мы можем использовать html и css:



Test


List of people

{{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a} for person in people {33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}}

{{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a} endfor {33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}}

Last Name First Name Email
{{ person.last_name }} {{ person.first_name }} {{ person.email }}



4. Мы можем использовать теги django ({{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a} for {33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}}, {{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a} if {33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}} и т.д.) в шаблонах. Проверим что получилось:

Создание PDF в Django с помощью WeasyPrint
Как видите, всего за четыре простых шага мы научили django выводить информацию в виде PDF.

По материалам «How To Generate PDF in Django with WeasyPrint»

Leave a Comment