COMO GERAR UM ARQUIVO PDF COM DJANGO
- #Django
- #Python
Gerar arquivos PDF com o Django Framework é crucial para oferecer aos usuários a capacidade de salvar e compartilhar informações de forma conveniente e padronizada. Isso melhora a experiência do usuário, facilita a impressão de documentos e ajuda na distribuição de relatórios, documentos legais e outros conteúdos críticos de maneira profissional e acessível.
Além disso, o PDF é um formato amplamente compatível, garantindo que os dados sejam acessíveis em diferentes dispositivos e sistemas operacionais.
Então aqui está o seu pequeno tutorial de como gerar um arquivo PDF com Django!
# Técnica 1
O que você vai precisar?
- Claramente do django, um nome de projeto e uma aplicação.
pip3 install django
django-admin startproject relatorio .
django-admin startapp core
Fazer as configurações necessárias no settings.py
Usar a biblioteca Reportlab recomendada nas documentações do Django:
pip3 install reportlab
python3 manage.py shell
import reportlab
Executar os seguintes passos para verificar se não houve nenhum erro na instalação da biblioteca.
Criar um arquivo de rotas na aplicação core:
from django.urls import path
from .views import IndexView
urlpatterns = [
path('', IndexView.as_view(), name='index'),
]
Avisar a rotas do projeto:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('', include('core.urls')),
path('admin/', admin.site.urls),
]
Criando os comandos para a geração do PDF:
Na views.py:
import io
from django.http import FileResponse
from django.views.generic import View
from reportlab.pdfgen import canvas
class IndexView(View):
def get(self, request, *args, **kwargs):
# Cria um arquivo para receber os dados e gerar o PDF
buffer = io.BytesIO()
# Cria o arquivo PDF
pdf = canvas.Canvas(buffer)
# Insere "coisas" no PDF
pdf.drawString(100, 100, "Gerando PDF com Django")
# Ao finalizar a inserção de coisas
pdf.showPage()
pdf.save()
# Por fim, retornar o buffer para o inicio do arquivo
buffer.seek(0)
return FileResponse(buffer, as_attachment=True, filename='Relatorio1.pdf')
# Abre o PDF direto no navegador
return FileResponse(buffer, filename='Relatorio1.pdf')
Isso irá gerar um página em PDF.
O reportlab possui duas versões, a opensource com algumas limitações, e a versão paga.
Há outra forma de gerar PDF com Django:
# Técnica 2
Através da biblioteca WeasyPrint que é opensource e desenvolvido para usar com Python.
A partir de uma página HTML essa biblioteca printa a página e gera o arquivo PDF.
pip3 install WeasyPrint
No template de relatório.html:
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Report - Django</title>
<style>
body {
background: #0080ff;
}
</style>
</head>
<body>
<h1>Report - Django</h1>
{% for p in texto %}
<p>{{ p }}</p>
{% endfor %}
</body>
</html>
Na views.py:
from django.core.files.storage import FileSystemStorage
from django.template.loader import render_to_string
from django.http import HttpResponse
from weasyprint import HTML
class Index2View(View):
def get(self, request, *args, **kwargs):
texto = [
'Gerando arquivo PDF', 'Evolua seu lado Programador Django',
'Programação Web com Python e Django'
]
html_string = render_to_string(
'relatorio.html',
{'texto': texto}
)
html = HTML(
string=html_string
)
html.write_pdf(
target='/tmp/relatorio2.pdf'
)
fs = FileSystemStorage('/tmp')
with fs.open('relatorio2.pdf') as pdf:
response = HttpResponse(pdf, content_type='application/pdf')
# Faz o download do arquivo PDF
# response['Content-Disposition'] = 'attachment: filename="relatorio2.pdf"'
# Abre o PDF como página HTML:
response['Content-Disposition'] = 'inline: filename="relatorio2.pdf"'
return response
Na urls.py da aplicação:
from django.urls import path
from .views import IndexView, Index2View
urlpatterns = [
path('', IndexView.as_view(), name='index'),
path('2/', Index2View.as_view(), name='index2'),
]
Agora você conhece duas formas de gerar arquivos PDF com Django Framework :)
OBS. Lembrando que essas técnicas são feitas para adaptar para uma página Web já criada.