Основная часть каждого бизнес-приложения или CRM – распечатать некоторые документы, такие как отчеты, счета, и т. Д., И PDF – самый популярный формат. Как это то, что обычно, это также удивительно, насколько сложным может быть иногда для выполнения такой задачи.
Я был вовлечен в небольшой проект Django, где определенно печатание документов PDF требовалось в качестве основной функциональности. После небольшого поиска я нашел адаптацию Python уже известной библиотеки из моих дней в мире PHP, FPDF И в этом случае PYFDPF. это тот, который я использовал.
Но давайте не будем скучать больше времени и загрязнять наши руки, чтобы произвести файл PDF в Django и отобразить его в браузере.
Сначала давайте установим библиотеку, это мы можем сделать использование PIP:
pip install fpdf
Но будет лучше включать его требования. atxt, как рекомендовано Лучшие практики для управления зависимостью :
fpdf==1.7.2
Мы создадим файл шаблона, который он будет содержать HTML для отображения в PDF. Мне нравится размещать эти файлы в определенную папку, поэтому удерживайте мои шаблоны организованными.
. └── main | └── ... | └── urls.py └── my_app └── ... └── pdfs └── templates └── __init__.py └── pdf └── example.html
Ниже вы можете найти пример HTML-кода, который я поднял из документа библиотеки и проверить элементы. В том числе встроенный Django статический Тег шаблона позволяет нам включать изображения из вашей статической папки в HTML.
{% load static %}Example
Basic usage
You can now easily print text mixing different styles : bold, italic, underlined, or all at once!
You can also insert links on text, such as www.fpdf.org, or on an image: click on the logo.
Sample List
- option 1
- option 2
- option 3
Header 1 | header 2 |
---|---|
cell 1 | cell 2 |
cell 2 | cell 3 |
Таким образом, мы готовы создать метод для того, чтобы сделать это HTML в документе PDF и доставить в браузер для визуализации, упаковывая его в HTTPResponse.
from django.shortcuts import HttpResponse from django.template.loader import get_template, render_to_string from fpdf import FPDF, HTMLMixin class HtmlPdf(FPDF, HTMLMixin): pass def print_pdf(request): pdf = HtmlPdf() pdf.add_page() pdf.write_html(render_to_string('pdf/example.html')) response = HttpResponse(pdf.output(dest='S').encode('latin-1')) response['Content-Type'] = 'application/pdf' return response
Создание класса с объектами FPDF и HTMLMIXIN сделают трюк, чтобы write_html Метод можно использовать в логике FPDF. Этот метод требует строки, содержащей код HTML, поэтому мы используем Django Render_to_string Чтобы преобразовать в строку объект шаблона, открытый на погрузчик Отказ
Как правила документации, при использовании Python 3.x вам нужно добавить .encode («Латин-1»)
к выходу метода, чтобы правильно рендерировать.
Мы просто упускаем способ звонить print_pdf и мы можем сделать это через новую запись в URLS.PY
from django.urls import path from myapp import views as web_views urlpatterns = [ path( "pdf/example", web_views.print_pdf, name="print_pdf", ), ]
Хорошо, если вы приехали это далеко и получите бегущий экземпляр Django, например, используя функциональность Django для запуска сервера, вы сможете получить доступ к вызову PDF:
http://127.0.0.1:8000/pdf/example
Как сказано, прежде чем это основной пример, который может использовать для визуализации HTML в PDF и отображать его в браузере, однако, можно сохранить файл локально, просто изменить PDF.Output Syntaxis:
target = os.path.join(BASE_DIR, 'my_app', 'pdfs') pdf.output(target + '/example.pdf', 'F')
Примечания:
У вас все еще есть длительное путешествие, чтобы создать полный файл PDF, который может быть представлен как отчет из вашего приложения, по этой причине я бы предложил вам погрузиться в документацию PYFDPF обнаружить больше функциональности.
Оригинал: “https://dev.to/davilopez/django-render-html-as-pdf-to-the-browser-1i27”