Arquivos PDF com Python

Você provavelmente já está familiarizado com as diversas bibliotecas e ferramentas disponíveis para manipular e gerar conteúdos com Python. Entre suas muitas habilidades extremamente úteis está a sua capacidade de criar arquivos PDF. Através deste recurso, podemos gerar relatórios automaticamente a partir de nossos dados, criar manuais do usuário, guias ou documentos técnicos que podem ser facilmente compartilhados e acessados, produzir versões digitais de livros, revistas ou outras publicações. Portanto, neste post, exploraremos a criação de PDFs com Python.
Bibliotecas do Python para a Criação de arquivos PDF
Para criar arquivos PDF com Python, você precisará de uma biblioteca que suporte essa funcionalidade. Algumas opções populares incluem:
ReportLab: biblioteca madura com documentação extensa, ideal para criar relatórios e documentos complexos.
PyPDF2: biblioteca leve perfeita para manipulação e criação de PDFs simples.
fpdf2: outra opção leve, adequada para geração básica de PDFs. Esta biblioteca é um fork da biblioteca anterior, fpdf.
Para este post, nos concentraremos na biblioteca fpdf2 devido à sua simplicidade e facilidade de uso.
biblioteca fpdf2
Apesar de leve e fácil de usar, a biblioteca fpdf2 não decepciona em termos de recursos. Ela tem praticamente tudo que você precisa para criar PDFs com Python, incluindo:
Incorporação de subconjunto de fontes TrueType Unicode (UTF-8)
Links internos / externos
Incorporação de imagens, incluindo transparência e canal alfa
Importação básica de SVG
Incorporação de códigos de barras, tabelas e gráficos, emojis, símbolos e dingbats
Tabelas e escrita de células / multicélulas
Textos simples, com quebras de página automáticas, quebra de linha e justificação de texto
Escolha da unidade de medida, formato de página e margens
Cabeçalho e rodapé de página opcionais
Conversão básica de HTML para PDF
Um sistema de modelos para renderizar PDFs em lotes
Imagens e links com descrições alternativas, para acessibilidade
Índice e esboço do documento
Criptografia e assinatura de documentos
Anotações, incluindo realces de texto e anexos de arquivo
- Modo de apresentação com controle sobre a duração e as transições de exibição de página
Estilo básico opcional semelhante ao Markdown: **negrito**, __italics__
Pode renderizar equações matemáticas e gráficos
Neste post, cobriremos alguns de seus recursos básicos. Para os interessados em avançar nas funcionalidades da biblioteca, consulte a documentação oficial (aqui).
fpdf2 em código
Para usar a biblioteca fpdf2, você precisará instalá-la usando o pip ou conda:
pip install fpdf2
conda install conda-forge::fpdf2
Vamos começar com um exemplo básico para ilustrar como criar um arquivo PDF com fpdf2. Num código Python, importamos a classe FPDF da biblioteca:
from fpdf import FPDF
Em seguida, iniciamos uma instância da classe FPDF e criamos uma página:
# Cria uma instância da classe FPDF
pdf = FPDF()
# Adiciona uma página ao PDF
pdf.add_page()
No formato padrão, as páginas estão em modo retrato A4 e a unidade de medida é milímetro. Estes valores podem ser alterados. Consulte a documentação oficial para conhecer outras opções.
Após criarmos uma página, definimos a fonte que será usada:
# Define fonte e tamanho
pdf.set_font("Helvetica", size=15)
Nesta etapa, podemos definir diferentes estilos para a nossa fonte como negrito ou itálico. Para isto, basta adicionar style=’B’, ou style=’I’, no comando mostrado acima.
Em seguida, criamos uma célula com o comando cell. Uma célula é uma área retangular que contém algum texto. Ela pode ser emoldurada. A área retangular é renderizada na posição atual. Especificamos suas dimensões, seu texto (text, centralizado (C) ou alinhado), se as bordas devem ser desenhadas e para onde a posição atual se move depois dela (para a direita, abaixo ou para o início da próxima linha). Veja um exemplo de como adicionar uma célula:
# Adiciona texto centralizado na página
pdf.cell(0, 10, text="Olá Mundo!", align='C')
Por fim, salvamos o arquivo PDF com o comando:
# Salva o arquivo PDF
pdf.output("olá_mundo.pdf")
Ao executar o código, você verá o arquivo PDF ser gerado contendo o texto “Ola Mundo!”.
Arquivo PDF de um Relatório Simples: cabeçalho
Agora partiremos para um exemplo um pouco mais complexo, mostrando como usar a biblioteca fpdf2 para gerar um relatório simples. Primeiro, criaremos o cabeçalho e o rodapé do nosso documento. Este exemplo usa os métodos header e footer definidos na classe FPDF. Eles são ideais para adicionar cabeçalhos e rodapés de página em poucas linhas de código. Eles são chamados automaticamente, mas temos que estender a classe para adicionar conteúdos. Veja o código de exemplo abaixo. Ele cria o cabeçalho do documento:
from fpdf import FPDF
class PDF(FPDF):
def header(self):
# Renderiza um logo:
self.image("local_da_sua_imagem/minha_imagem.png", 10, 8, 23)
# Define uma fonte e seu tamanho: helvetica negrito 15
self.set_font("helvetica", style="B", size=15)
# Move o cursor para a direita:
self.cell(80)
# Imprime o título:
self.cell(30, 10, "Título", border=1, align="C")
# Executa uma quebra de linha:
self.ln(20)
Neste exemplo, primeiro importamos a classe FPDF. Depois, definimos um cabeçalho. Nosso cabeçalho possui um logotipo e o título do documento. O logotipo é impresso com o método de imagem (preencha corretamente o local da sua imagem no código acima, use formatos PNG ou JPEG/JPG). Especificamos que o logo deve ser posicionado no canto superior esquerdo da página e definimos a sua largura. A altura é calculada automaticamente para respeitar as proporções da imagem. Note que o cabeçalho conta ainda com a quebra automática de página (ln). Assim que uma célula ultrapassa um limite na página (a 2 centímetros da parte inferior por padrão), uma quebra é executada e a fonte é restaurada.
Arquivo PDF de um Relatório Simples: rodapé e corpo de texto
Dando sequência à classe sendo expandida como mostrado acima, faremos agora o rodapé do documento. Ele mostrará o número da página atual e o número total de páginas do documento. Veja o nosso código:
from fpdf import FPDF
class PDF(FPDF):
def header(self):
...
def footer(self):
# Posiciona o cursor a 1,5 cm da parte inferior
self.set_y(-15)
# Define a font: helvetica itálico 8
self.set_font("helvetica", style="I", size=8)
# Imprime o número da página
self.cell(0, 10, f"Página {self.page_no()}/{{nb}}", align="C")
No rodapé mostrado acima, para imprimir o número da página, um valor nulo é passado como a largura da célula. Isso significa que a célula deve se estender até a margem direita da página. O número da página atual é retornado pelo método page_no. Quanto ao número total de páginas, ele é obtido por meio do valor especial {nb} que será substituído no fechamento do documento. Observe que usamos também o método set_y(). Ele permite definir a posição do texto em um local absoluto na página, começando de cima ou de baixo.
Após a definição do cabeçalho e rodapé mostrados acima, estendemos o código para demostrar como adicionar um corpo de texto:
# Instanciação da classe herdada
pdf = PDF()
# Adiciona uma página ao PDF
pdf.add_page()
# Define fonte e tamanho
pdf.set_font("Times", size=12)
# Adiciona texto
for i in range(1, 41):
pdf.cell(0, 20, f"Imprime número da linha {i}", new_x="LMARGIN", new_y="NEXT")
# Salva arquivo PDF
pdf.output("rel.pdf")
Neste trecho do código, fazemos a instanciação da classe expandida contendo o cabeçalho e rodapé. Depois, adicionamos uma nova página ao documento e definimos a fonte do corpo do texto como Times. Em seguida, usamos um for loop simples para inserir um texto como conteúdo para nosso relatório. Neste exemplo, o texto consiste somente na frase “Imprime o número da linha” seguida do número correto. Por fim, geramos o PDF com o conteúdo completo.
Conclusão
Criar arquivos PDF com Python é uma habilidade valiosa para qualquer desenvolvedor. Com bibliotecas como a fpdf2, você pode gerar relatórios, documentação digital e livros eletrônicos com facilidade. Lembre-se de visitar a página oficial da biblioteca para conhecer outros recursos e opções de layout para criar documentos profissionais. Fique de olho por mais tutoriais sobre Python e IA!