# Documentação Django 5.2.8

# How to create PDF files

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 ReportLab

The ReportLab library is available on PyPI. A user guide (not coincidentally, a PDF file) is also available for download. You can install ReportLab with `pip`:

/ 

    $ python -m pip install reportlab

    ...\> py -m pip install reportlab

Test your installation by importing it in the Python interactive interpreter:

    >>> import reportlab

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

## Escreva sua “view”

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”:

    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.

Nota

O ReposrtLab não tem mecanismos de segurança para ser usado de maneira concorrente, ou não é thread-safe. Alguns de nossos usuários tem relatado problemas ímpares ao gerar PDF em “views” Django que são acessadas por muitos usuários ao mesmo tempo.

## Outros formatos

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.

Ver também

O Django Packages fornece uma ferramenta para comparação de pacotes que auxiliam a geração de arquivos PDF com o Django