В создании 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:
List of people
Last Name | First Name | |
---|---|---|
{{ person.last_name }} | {{ person.first_name }} | {{ person.email }} |
4. Мы можем использовать теги django ({{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a} for {33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}}, {{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a} if {33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}} и т.д.) в шаблонах. Проверим что получилось:
Как видите, всего за четыре простых шага мы научили django выводить информацию в виде PDF.
По материалам «How To Generate PDF in Django with WeasyPrint»
Разработчик: java, kotlin, c#, javascript, dart, 1C, python, php.
Пишите: @ighar. Buy me a coffee, please :).