Рубрики
Без рубрики

Django: Визуализация HTML как PDF в браузер

Этот документ описывает подход к оказанию HTML-документа, как в формате PDF, и возможность служить ему в браузере через рамки Django .. Теги с Python, Django, PDF.

Основная часть каждого бизнес-приложения или 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
    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”