1. Grundlagen der Arbeit mit ReportLab
Arbeiten mit Canvas
Das Hauptwerkzeug zur Erstellung von PDF-Dokumenten in ReportLab ist die Klasse canvas. Sie bietet Methoden zum Hinzufügen von Text, Linien, Rechtecken und anderen grafischen Elementen.
Einfaches PDF mit Text erstellen
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
# Neues PDF erstellen
pdf_file = canvas.Canvas("basic_report.pdf", pagesize=A4)
width, height = A4
# Text hinzufügen
pdf_file.setFont("Helvetica", 12) # Schriftart und Größe setzen
pdf_file.drawString(100, height - 100, "Hallo! Dies ist ein Bericht, erstellt mit ReportLab.")
# Speichern und PDF schließen
pdf_file.save()
In diesem Beispiel wird eine einfache PDF-Datei mit dem Text "Hallo! Dies ist ein Bericht, erstellt mit ReportLab." auf der ersten Seite erstellt.
2. Hinzufügen von Text in die PDF
ReportLab ermöglicht eine flexible Anpassung des Textes, einschließlich Größe, Schriftart und Farbe. Das ist wichtig für strukturierte Berichte, da Überschriften, Unterüberschriften und Haupttext unterschiedlich aussehen können.
Schriftart und Größe einstellen
Nutze die Methode setFont(), um die Schriftart und -größe festzulegen. ReportLab unterstützt Standard-Schriftarten wie Helvetica, Times-Roman und Courier.
pdf_file.setFont("Helvetica-Bold", 16) # Fette Schrift
pdf_file.drawString(100, height - 50, "Verkaufsbericht") # Überschrift
Textfarbe ändern
ReportLab unterstützt das Setzen der Textfarbe mithilfe der Methode setFillColorRGB(), die RGB-Werte von 0 bis 1 entgegennimmt.
pdf_file.setFillColorRGB(0, 0, 1) # Blaue Farbe
pdf_file.drawString(100, height - 150, "Dieser Text ist blau.")
3. Arbeiten mit Textblöcken und mehrzeiligem Text
Wenn der Text länger ist, kann er als Block mit drawString() formatiert werden, indem die Koordinaten für jede Zeile definiert werden. Um den Text jedoch automatisch zu umbrechen, ist es praktischer, drawText() und TextObject zu verwenden.
Mehrzeiligen Text mit TextObject hinzufügen
text = """
Verkaufsbericht für das Jahr 2023.
Dieser Bericht enthält detaillierte Informationen zu Verkäufen, Datenanalysen und Prognosen.
"""
# Textobjekt erstellen
text_object = pdf_file.beginText(100, height - 200)
text_object.setFont("Helvetica", 12)
text_object.setFillColorRGB(0, 0, 0)
# Text hinzufügen
for line in text.split("\n"):
text_object.textLine(line)
pdf_file.drawText(text_object)
In diesem Beispiel wird ein Textobjekt TextObject erstellt, das jede Textzeile automatisch umbricht.
4. Erstellung von mehrseitigen Berichten
Mehrseitige Berichte ermöglichen die Darstellung größerer Datenmengen und schaffen eine leserfreundliche Dokumentstruktur. In ReportLab wird der Übergang zu einer neuen Seite mit der Methode showPage() durchgeführt.
Mehrseitiges PDF erstellen
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
# PDF erstellen
pdf_file = canvas.Canvas("multi_page_report.pdf", pagesize=A4)
width, height = A4
# Seite 1
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "Seite 1: Einführung")
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 130, "Dies ist die erste Seite des Berichts.")
pdf_file.showPage() # Zur nächsten Seite
# Seite 2
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "Seite 2: Daten")
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 130, "Dies ist die zweite Seite des Berichts.")
# PDF speichern und schließen
pdf_file.save()
In diesem Beispiel wird eine zweiseitige PDF erstellt, bei der jede Seite ihre eigene Überschrift und ihren eigenen Text hat. Die Methode showPage() beendet die aktuelle Seite und beginnt eine neue.
5. Dynamische Daten in die PDF einfügen
Zur Automatisierung der Berichterstattung ermöglicht ReportLab das dynamische Einfügen von Daten, z. B. aus einer Liste oder einem Dictionary. Das ist nützlich, um Berichte mit Tabellen oder Listen von Daten zu erstellen, die regelmäßig aktualisiert werden können.
Daten aus einer Liste hinzufügen
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
data = [
{"Monat": "Januar", "Verkäufe": 200},
{"Monat": "Februar", "Verkäufe": 300},
{"Monat": "März", "Verkäufe": 250},
]
pdf_file = canvas.Canvas("sales_report.pdf", pagesize=A4)
width, height = A4
# Überschrift
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "Verkaufsbericht")
# Daten hinzufügen
pdf_file.setFont("Helvetica", 12)
y_position = height - 150
for item in data:
line = f"{item['Monat']}: Verkäufe = {item['Verkäufe']}"
pdf_file.drawString(100, y_position, line)
y_position -= 20
# PDF speichern
pdf_file.save()
Dieser Code erstellt eine PDF-Datei, bei der die Verkaufsdaten für jeden Monat in separaten Zeilen hinzugefügt werden.
6. Bilder hinzufügen
Zusätzlich zum Text können in einer PDF-Dokument auch Bilder und Diagramme enthalten sein. Probieren wir aus, wie wir ein Bild hinzufügen können:
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, "Hier ist dein Bild:")
# Pfad zu deinem Bild
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)
Einfach, oder? Jetzt haben wir eine PDF mit einem Bild!
Nun, da du weißt, wie man eine PDF mit Text und Bildern erstellt, lass uns überlegen, wie du das im echten Leben anwenden könntest. Stell dir vor, du arbeitest in einem Analysebüro und musst jeden Monat Verkaufsberichte erstellen. Anstatt jedes Mal das Dokument manuell vorzubereiten, kannst du ein Skript schreiben, das automatisch Daten sammelt und einen PDF-Bericht generiert. Das spart nicht nur Zeit, sondern verbessert auch die Genauigkeit und Konsistenz der Berichtsdaten.
7. Tabellen in eine PDF einfügen
Jetzt machen wir einen kleinen Schritt weg vom einfachen Text. Was, wenn wir Daten hinzufügen wollen, wie z.B. eine Liste von Produkten und deren Preise? Schauen wir uns ein einfaches Beispiel an:
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
items = [("Bügeleisen", 42.99), ("Wasserkocher", 15.00), ("Fernseher", 250.00)]
def create_pdf_with_table(file_path):
c = canvas.Canvas(file_path, pagesize=letter)
width, height = letter
c.drawString(100, height - 100, "Liste der Produkte und Preise:")
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)
Hier fügen wir eine einfache Liste von Produkten mit Preisen hinzu. Stell dir die Möglichkeiten vor: Du kannst eine vollständige Tabelle mit Daten erstellen, die aus einer anderen Datenbank kommen, z. B. deinem Lieblings-pandas DataFrame!
8. Verwendung von Vorlagen zur Automatisierung von Berichten
Einer der mächtigsten Ansätze zur Automatisierung von Berichten ist die Verwendung von Vorlagen. Im Grunde kannst du Dokumentvorlagen mit Struktur und Design erstellen und sie dann mit Daten über dein Skript füllen.
Erstellen eines Vorlagendokuments
Erstelle eine Hauptvorlage, die statische Elemente wie Logos und feste Überschriften enthält. Fülle sie dann automatisch mit dynamischen Daten wie Daten, Diagrammen oder Listen. Dies kann beispielsweise mit Jinja2 für Textvorlagen organisiert werden, um daraus das endgültige PDF zu generieren.
Für die Erstellung von Vorlagen mit ReportLab kannst du eine Kombination aus statischen und dynamischen Daten verwenden. Zum Beispiel ein vorbereiteter Hintergrund für einen Bericht mit firmenspezifischen Logos und festen Elementen, die dann mit dynamischen Inhalten aus den Daten deines Programms ergänzt werden.
GO TO FULL VERSION