Создание 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:

<html>
 <head>
   <title>Test</title>
   <style>
     h1 {
       text-align: center;
     }

     table {
       border: 1px solid;
       margin: 0 auto;
       width: 70%;
     }

     td, th {
       text-align: center;
       border: 1px solid;
     }
   </style>
 </head>
 <body>
   <h1>List of people</h1>
   <table><thead><tr><th>Last Name</th><th>First Name</th><th>Email</th></tr></thead><tbody>
       {% for person in people %}
         <tr><td>{{ person.last_name }}</td><td>{{ person.first_name }}</td><td>{{ person.email }}</td></tr>{% endfor %}    
     </tbody>
   </table></body>
</html>

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

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

По материалам «How To Generate PDF in Django with WeasyPrint»
0 комментариев
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.