Objetivos do workshop¶
Apresentar o módulo
reportlabpara 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 %s, 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.
Ferramentas utilizadas¶
Módulos Python
plotlyreportlabos
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.
Instalação¶
Recomenda-se utilizar pip com: pip install reportlab.
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 canvasEm seguida, criamos uma função de utilidade para produzir as imagens no PDF.
# 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)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}').