1. Podstawy pracy z ReportLab
Praca z Canvas
Głównym narzędziem do tworzenia dokumentów PDF w ReportLab jest klasa canvas
. Udostępnia ona metody umożliwiające dodawanie tekstu, linii, prostokątów i innych elementów graficznych.
Tworzenie prostego pliku PDF z tekstem
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
# Tworzymy nowy plik PDF
pdf_file = canvas.Canvas("basic_report.pdf", pagesize=A4)
width, height = A4
# Dodajemy tekst
pdf_file.setFont("Helvetica", 12) # Ustawiamy czcionkę i rozmiar
pdf_file.drawString(100, height - 100, "Cześć! To jest raport utworzony za pomocą ReportLab.")
# Zapisujemy i zamykamy PDF
pdf_file.save()
W tym przykładzie tworzony jest prosty plik PDF z tekstem "Cześć! To jest raport utworzony za pomocą ReportLab." na pierwszej stronie.
2. Dodawanie tekstu do PDF
ReportLab pozwala elastycznie dostosowywać tekst, w tym czcionkę, rozmiar i kolor. Jest to ważne przy tworzeniu uporządkowanych raportów, gdyż nagłówki, podtytuły i główny tekst mogą wyglądać inaczej.
Ustawienie czcionki i rozmiaru tekstu
Użyj metody setFont()
, aby ustawić czcionkę i rozmiar tekstu. ReportLab obsługuje standardowe czcionki, takie jak Helvetica
, Times-Roman
oraz Courier
.
pdf_file.setFont("Helvetica-Bold", 16) # Pogrubiona czcionka
pdf_file.drawString(100, height - 50, "Raport sprzedaży") # Nagłówek
Zmiana koloru tekstu
ReportLab obsługuje ustawianie koloru tekstu za pomocą metody setFillColorRGB()
, która przyjmuje wartości RGB od 0 do 1.
pdf_file.setFillColorRGB(0, 0, 1) # Niebieski kolor
pdf_file.drawString(100, height - 150, "Ten tekst jest niebieski.")
3. Praca z blokami tekstowymi i wielowierszowym tekstem
Jeżeli tekst jest długi, można go sformatować jako blok, używając drawString()
i podając współrzędne dla każdej linii. Jednak do automatycznego łamania tekstu lepiej użyć drawText()
i TextObject
.
Dodanie wielowierszowego tekstu za pomocą TextObject
text = """
Raport sprzedaży za 2023 rok.
Ten raport zawiera szczegółowe informacje o sprzedaży, analizę danych i prognozy.
"""
# Tworzenie obiektu tekstowego
text_object = pdf_file.beginText(100, height - 200)
text_object.setFont("Helvetica", 12)
text_object.setFillColorRGB(0, 0, 0)
# Dodawanie tekstu
for line in text.split("\n"):
text_object.textLine(line)
pdf_file.drawText(text_object)
W tym przykładzie tworzony jest obiekt tekstowy TextObject
, który automatycznie łamie każdą linię tekstu.
4. Tworzenie raportów wielostronicowych
Raporty wielostronicowe pozwalają zawrzeć więcej danych i stworzyć strukturę dokumentu, która jest wygodna do czytania. W ReportLab do przechodzenia na nową stronę używana jest metoda showPage()
.
Tworzenie wielostronicowego pliku PDF
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
# Tworzymy PDF
pdf_file = canvas.Canvas("multi_page_report.pdf", pagesize=A4)
width, height = A4
# Strona 1
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "Strona 1: Wprowadzenie")
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 130, "To jest pierwsza strona raportu.")
pdf_file.showPage() # Przejście na nową stronę
# Strona 2
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "Strona 2: Dane")
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 130, "To jest druga strona raportu.")
# Zapisanie i zamknięcie PDF
pdf_file.save()
W tym przykładzie tworzony jest PDF z dwiema stronami, z których każda ma swój nagłówek i tekst. Metoda showPage()
kończy bieżącą stronę i rozpoczyna nową.
5. Dodawanie dynamicznych danych do PDF
Dla automatyzacji raportów ReportLab pozwala dynamicznie dodawać dane, na przykład z listy czy słownika. Jest to przydatne przy tworzeniu raportów z tabelami lub listami danych, które mogą być regularnie aktualizowane.
Dodawanie danych z listy
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
data = [
{"Miesiąc": "Styczeń", "Sprzedaż": 200},
{"Miesiąc": "Luty", "Sprzedaż": 300},
{"Miesiąc": "Marzec", "Sprzedaż": 250},
]
pdf_file = canvas.Canvas("sales_report.pdf", pagesize=A4)
width, height = A4
# Nagłówek
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "Raport sprzedaży")
# Dodawanie danych
pdf_file.setFont("Helvetica", 12)
y_position = height - 150
for item in data:
line = f"{item['Miesiąc']}: Sprzedaż = {item['Sprzedaż']}"
pdf_file.drawString(100, y_position, line)
y_position -= 20
# Zapisanie PDF
pdf_file.save()
Ten kod tworzy plik PDF, dodając dane o sprzedaży za każdy miesiąc jako osobne linie.
6. Dodawanie obrazów
Poza tekstem w dokumencie PDF mogą być również obrazy i grafiki. Spróbujmy dodać obraz:
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, "Tutaj będzie Twój obraz:")
# Ścieżka do obrazu
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)
Proste, prawda? Teraz mamy PDF z obrazem!
Teraz, kiedy wiesz, jak tworzyć PDF z tekstem i obrazami, pomyśl, jak możesz to wykorzystać w prawdziwym życiu. Wyobraź sobie, że pracujesz w firmie analitycznej i co miesiąc musisz przygotowywać raporty sprzedażowe. Zamiast ręcznie tworzyć dokument za każdym razem, możesz napisać skrypt, który automatycznie zbierze dane i wygeneruje raport PDF. Zaoszczędzi to Twój czas i zwiększy dokładność oraz spójność danych w raporcie.
7. Dodawanie tabel do PDF
Teraz zróbmy mały krok w stronę czegoś bardziej skomplikowanego niż zwykły tekst. Co, jeśli chcemy dodać dane, takie jak lista produktów i ich cena? Weźmy prosty przykład:
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
items = [("Żelazko", 42.99), ("Czajnik", 15.00), ("Telewizor", 250.00)]
def create_pdf_with_table(file_path):
c = canvas.Canvas(file_path, pagesize=letter)
width, height = letter
c.drawString(100, height - 100, "Lista produktów i ich ceny:")
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)
W tym przykładzie dodajemy prostą listę produktów z cenami. Wyobraź sobie możliwości: możesz stworzyć pełnoprawną tabelę z danymi pochodzącymi z bazy danych, na przykład z Twojego ulubionego pandas DataFrame!
8. Korzystanie z szablonów do automatyzacji raportów
Jednym z najpotężniejszych podejść do automatyzacji raportów jest korzystanie z szablonów. Możesz tworzyć szablony dokumentów z określoną strukturą i projektowaniem, a następnie wypełniać je danymi za pomocą swojego skryptu.
Tworzenie szablonowego dokumentu
Stwórz podstawowy szablon, który będzie zawierał elementy statyczne, takie jak logotypy i stałe nagłówki. Następnie automatycznie wypełnij go dynamicznymi danymi, takimi jak daty, wykresy czy listy. Można to zorganizować, używając np. Jinja2 do szablonowego tekstu, a następnie generować finalny dokument PDF.
Do tworzenia szablonów z ReportLab można używać kombinacji danych statycznych i dynamicznych. Na przykład wcześniej przygotowane tło dla raportu z firmowymi logotypami i stałymi elementami, które są nakładane na dynamiczną treść generowaną z danych aplikacji.
GO TO FULL VERSION