Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Dataviz Workshop: Data Reporting com reportlab

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 %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

    • plotly

    • reportlab

    • os

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 canvas

Em 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.