1. Basi per lavorare con ReportLab
Utilizzo del Canvas
Lo strumento principale per creare documenti PDF con ReportLab è la classe canvas
. Fornisce metodi per aggiungere testo, linee, rettangoli e altri elementi grafici.
Creare un semplice file PDF con testo
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
# Creiamo un nuovo file PDF
pdf_file = canvas.Canvas("basic_report.pdf", pagesize=A4)
width, height = A4
# Aggiungiamo il testo
pdf_file.setFont("Helvetica", 12) # Impostiamo il font e la dimensione
pdf_file.drawString(100, height - 100, "Ciao! Questo è un report creato con ReportLab.")
# Salviamo e chiudiamo il PDF
pdf_file.save()
In questo esempio, viene creato un semplice file PDF con il testo "Ciao! Questo è un report creato con ReportLab." nella prima pagina.
2. Aggiungere testo al PDF
ReportLab consente di configurare il testo in modo flessibile, inclusi dimensione, font e colore. Questo è importante per creare report strutturati, dove titoli, sottotitoli e testo principale possono avere un aspetto diverso.
Impostare il font e la dimensione del testo
Usa il metodo setFont()
per impostare il font e la dimensione del testo. ReportLab supporta font standard come Helvetica
, Times-Roman
e Courier
.
pdf_file.setFont("Helvetica-Bold", 16) # Font in grassetto
pdf_file.drawString(100, height - 50, "Report di vendita") # Titolo
Modificare il colore del testo
ReportLab supporta la configurazione del colore del testo tramite il metodo setFillColorRGB()
, che accetta valori RGB da 0 a 1.
pdf_file.setFillColorRGB(0, 0, 1) # Colore blu
pdf_file.drawString(100, height - 150, "Questo testo è blu.")
3. Lavorare con blocchi di testo e testo multilinea
Se il testo è lungo, può essere formattato come un blocco usando drawString()
e specificando coordinate per ogni riga. Tuttavia, per il wrapping automatico, è più comodo usare drawText()
e TextObject
.
Aggiungere testo multilinea con TextObject
text = """
Report di vendita per l'anno 2023.
Questo report contiene informazioni dettagliate sulle vendite, analisi dei dati e previsioni.
"""
# Creazione di un oggetto testo
text_object = pdf_file.beginText(100, height - 200)
text_object.setFont("Helvetica", 12)
text_object.setFillColorRGB(0, 0, 0)
# Aggiunta del testo
for line in text.split("\n"):
text_object.textLine(line)
pdf_file.drawText(text_object)
In questo esempio viene creato un oggetto testo TextObject
, che avvolge automaticamente ogni riga di testo.
4. Creazione di report multi-pagina
I report multi-pagina consentono di inserire più dati e creare una struttura documentale leggibile. In ReportLab, il metodo showPage()
viene utilizzato per passare a una nuova pagina.
Creare un file PDF multi-pagina
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
# Creiamo un PDF
pdf_file = canvas.Canvas("multi_page_report.pdf", pagesize=A4)
width, height = A4
# Pagina 1
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "Pagina 1: Introduzione")
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 130, "Questa è la prima pagina del report.")
pdf_file.showPage() # Passiamo a una nuova pagina
# Pagina 2
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "Pagina 2: Dati")
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 130, "Questa è la seconda pagina del report.")
# Salviamo e chiudiamo il PDF
pdf_file.save()
In questo esempio viene creato un PDF con due pagine, ognuna delle quali contiene un titolo e un testo. Il metodo showPage()
conclude la pagina corrente e ne avvia una nuova.
5. Aggiungere dati dinamici al PDF
Per automatizzare la reportistica, ReportLab consente di aggiungere dati in modo dinamico, ad esempio da una lista o dizionario. Questo è utile per creare report con tabelle o elenchi di dati che possono essere aggiornati regolarmente.
Aggiungere dati da una lista
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
data = [
{"Mese": "Gennaio", "Vendite": 200},
{"Mese": "Febbraio", "Vendite": 300},
{"Mese": "Marzo", "Vendite": 250},
]
pdf_file = canvas.Canvas("sales_report.pdf", pagesize=A4)
width, height = A4
# Titolo
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "Report di vendita")
# Aggiunta dei dati
pdf_file.setFont("Helvetica", 12)
y_position = height - 150
for item in data:
line = f"{item['Mese']}: Vendite = {item['Vendite']}"
pdf_file.drawString(100, y_position, line)
y_position -= 20
# Salviamo il PDF
pdf_file.save()
Questo codice crea un file PDF aggiungendo i dati di vendita per ogni mese in righe separate.
6. Aggiungere immagini
Oltre al testo, un documento PDF può contenere immagini e grafici. Proviamo ad aggiungere un'immagine:
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
def create_pdf_with_image(file_path):
c = canvas.Canvas(file_path, pagesize=letter)
width, height = letter
c.drawString(100, height - 100, "Qui ci sarà la tua immagine:")
# Percorso alla tua immagine
image_path = "example_image.jpg"
c.drawImage(image_path, 100, height - 300, width=200, height=150)
c.showPage()
c.save()
file_path = "image_example.pdf"
create_pdf_with_image(file_path)
Facile, no? Ora abbiamo un PDF con un'immagine!
Ora che sai come creare PDF con testo e immagini, pensiamo a come puoi applicarlo nella vita reale. Immagina di lavorare in una società di analisi e devi creare report mensili sulle vendite. Invece di preparare manualmente il documento ogni volta, puoi scrivere uno script che raccoglie automaticamente i dati e genera un report PDF. Questo non solo risparmia tempo, ma aumenta anche l'accuratezza e la coerenza dei dati nel report.
7. Aggiungere tabelle al PDF
Ora facciamo un piccolo passo lontano dal semplice testo. E se volessimo aggiungere dati, come un elenco di prodotti e i loro prezzi? Ecco un esempio molto semplice:
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
items = [("Ferro da stiro", 42.99), ("Bollitore", 15.00), ("Televisore", 250.00)]
def create_pdf_with_table(file_path):
c = canvas.Canvas(file_path, pagesize=letter)
width, height = letter
c.drawString(100, height - 100, "Elenco dei prodotti e dei loro prezzi:")
y = height - 150
for item in items:
c.drawString(100, y, f"{item[0]} - {item[1]:.2f} $")
y -= 20
c.showPage()
c.save()
file_path = "table_example.pdf"
create_pdf_with_table(file_path)
Qui aggiungiamo un semplice elenco di prodotti con i prezzi. Immagina le possibilità: puoi creare una tabella completa con dati presi da un'altra fonte, ad esempio un pandas DataFrame!
8. Utilizzo di template per automatizzare i report
Uno degli approcci più potenti per l'automatizzazione dei report è l'utilizzo dei template. Fondamentalmente, puoi creare template con struttura e design, e poi riempirli con dati usando il tuo script.
Creare un documento template
Crea un template principale che contenga elementi statici come loghi e titoli fissi. Dopodiché, popolalo automaticamente con dati dinamici come date, grafici o liste. Questo può essere organizzato, ad esempio, con Jinja2 per il testo template, e poi generare il PDF finale.
Per creare template con ReportLab, puoi utilizzare una combinazione di dati statici e dinamici. Ad esempio, un layout di sfondo predefinito per il report con loghi aziendali ed elementi fissi, sovrapposti ai contenuti dinamici generati dai dati della tua applicazione.
GO TO FULL VERSION