Dataviz Workshop: Data Reporting com reportlab
Contents
20. Dataviz Workshop: Data Reporting com reportlab
#
20.1. Objetivos do workshop#
Apresentar o módulo
reportlab
para geração de PDFs;Desenvolver workflow básico para geração de relatórios automatizados incorporando figuras geradas pelo
plotly
.
Como vimos no Capítulo 19, a geração automatizada de relatórios pode ser feita a partir de muitas ferramentas.
Neste capítulo, exploraremos um workflow mínimo para conversão de dados em PDFs utilizando reportlab
.
20.2. Ferramentas utilizadas#
Módulos Python
plotly
reportlab
os
20.3. ReportLab#
ReportLab é uma biblioteca construída em Python útil para as seguintes finalidades:
geração dinâmica de PDF na web;
produção de relatórios corporativos em grande volume e publicação de dados;
acoplamento em outras aplicações, incluindo uma “linguagem de relatório” customizável;
embasar como sistema de construção, a geração de documentos complexos, com gráficos e tabelas para fins de contabilidade, análise estatística e também publicação científica;
A ReportLab possui duas versões, uma comercial e outra aberta. A versão aberta, ReportLab PDF Toolkit possui uma extensão documentação com tutoriais compreensíveis.
20.3.1. Instalação#
Recomenda-se utilizar pip com: pip install reportlab
.
20.4. Workflow demonstrativo#
Este workflow primário estende as capacidades discutidas com o módulo xhtml2pdf
e mostra como inserir figuras de alta qualidade geradas via plotly
em um documento PDF.
Começamos com as importações (boilerplate).
import os
import plotly.express as px
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
Em seguida, criamos uma função de utilidade para produzir as imagens no PDF.
Nota
Os métodos showPage
e save
não devem ser ignorados, visto que são eles os responsáveis por inserir os elementos na página do PDF e fechar o buffer do arquivo.
# Função de utilidade
def img_to_pdf(pdfout,imgout,x,y,
keep_img=False,
open_pdf=True):
# Cria canvas no PDF
c = canvas.Canvas(pdfout, pagesize=A4)
# Insere imagem
c.drawImage(imgout,x,y,preserveAspectRatio=True)
# Salva o PDF
c.showPage()
c.save()
# Deleta a imagem de teste
if not keep_img:
os.remove(imgout)
# Abre PDF para exibição
if open_pdf:
os.system(f'open {pdfout}')
Definimos alguns diretórios.
imgext = 'png' # formatos OK: png (melhor), jpg, eps
basedir = '../dw/reporting/'
pdfout = basedir + 'pdf-output/report.pdf'
imgout = os.path.join(basedir,'test.'+ imgext)
Nota
A experiência mostra que os formatos PNG, JPG e EPS, nesta ordem, são as melhores opções para renderização das imagens.
As figuras plotly.express podem ser objetos genéricos da classe.
fig = px.line(x=[1, 2, 3],
y=[4, 5, 6],
width=400,
height=400)
fig.write_image(imgout)
Por fim, a imagem é posta no PDF pela chamada da função de utilidade.
img_to_pdf(pdfout,imgout,120,300,
keep_img=False,
open_pdf=True)
Com esses pequenos passos, já é possível abrir o PDF para verificação.
Curiosidade
Visto que o módulo os
já foi importado, para abrir o arquivo PDF diretamente, em sistemas UNIX, bastaria chamar: _ = os.system(f'open {pdfout}')
.