How to create PDF filesLink para este cabeçalho

Este documnto explica como gerar arquivos PDF dinamicamente usando “views” Django. Isso é possível através da excelente, biblioteca Python de código-aberto RepostLab .

A vantagem de gerar arquivos PDF dinamicamente é que você pode criar PDFs personalizados para diferentes propósitos – vamos dizer, para diferentes usuários ou diferentes partes de conteúdo.

Por exemplo, o DJango foi usado no kusports.com para gerar relatórios personalizados, prontos para impressão, de pontuação de torneio da NCAA, como arquivos PDF, para pessoas que participam do concurso March Madness.

Instalar o ReportLabLink para este cabeçalho

A biblioteca RepostLab está disponível available on PyPI. Um guia de usuário em user guide (não coincidentemente um arquivo PDF) está disponível para download. Você pode instalar o ReportLab com pip:

Linux / macOS

Shell
$ python -m pip install reportlab

Windows

Windows
...\> py -m pip install reportlab

Teste sua instalação importando no interpretador interativo Python:

Code
>>> import reportlab

Se o comando não emitir nenhum erro, a instalação funciona.

Escreva sua “view”Link para este cabeçalho

A chave para gerar PDFs dinamicamente com Django é que a API do ReportLab atua em objetos tipo arquivo, e objetos da classe do Django FileResponse aceitam objetivos tipo arquivo.

Aqui um exemplo “Hello World”:

Code
import io
from django.http import FileResponse
from reportlab.pdfgen import canvas

def some_view(request):
    # Create a file-like buffer to receive PDF data.
    buffer = io.BytesIO()

    # Create the PDF object, using the buffer as its "file."
    p = canvas.Canvas(buffer)

    # Draw things on the PDF. Here's where the PDF generation happens.
    # See the ReportLab documentation for the full list of functionality.
    p.drawString(100, 100, "Hello world.")

    # Close the PDF object cleanly, and we're done.
    p.showPage()
    p.save()

    # FileResponse sets the Content-Disposition header so that browsers
    # present the option to save the file.
    buffer.seek(0)
    return FileResponse(buffer, as_attachment=True, filename='hello.pdf')

O código e comentário devem ser auto-explanaveis, mas algumas coisas merecem uma menção.

  • The response will automatically set the MIME type application/pdf based on the filename extension. This tells browsers that the document is a PDF file, rather than an HTML file or a generic application/octet-stream binary content.

  • When as_attachment=True is passed to FileResponse, it sets the appropriate Content-Disposition header and that tells web browsers to pop-up a dialog box prompting/confirming how to handle the document even if a default is set on the machine. If the as_attachment parameter is omitted, browsers will handle the PDF using whatever program/plugin they’ve been configured to use for PDFs.

  • Você pode fornecer um parâmetro filename arbitrário. Ele será usado para os navegadores na caixa de diálogo “Salvar como…”.

  • You can hook into the ReportLab API: The same buffer passed as the first argument to canvas.Canvas can be fed to the FileResponse class.

  • Note que todas os methods de geração de PDF subsequentes são chamados no objeto PDF (nesse caso, p) – não no buffer.

  • E finalmente, é importante chamar showPage() e o save() no arquivo PDF.

Outros formatosLink para este cabeçalho

Note que não tem muito nestes exemplos que seja especificamente sobre PDF – apenas as partes usando reportlab. Você pode usar técnicas similares para gerar qualquer outro formato arbitrário para a qual você encontre uma bilioteca Python. Veja também How to create CSV output para outro exemplo e algumas técnicas que você pode usar quando quiser gerar fomatos baseados em texto.