Leistungen

Backend Engineering, Dokumentenautomatisierung

Branche

Immobilien

Jahr

2022-2024

1.700 Zeilen Python, die ein ganzes PDF-Designteam ersetzt haben.

Eine Immobilienplattform benötigte gebrandete, mehrseitige Exposé-Dokumente für jedes Inserat. Jedes PDF musste dynamische Inhalte, hochauflösende Bilder, SVG-Logos, QR-Codes mit Link zur Immobilienseite, Markengradienten und ein konsistentes Layout unabhängig von der Inhaltslänge enthalten. Der bestehende Prozess bestand aus manueller InDesign-Arbeit. Jede Änderung am Inserat bedeutete, das PDF von Hand neu zu erstellen. Bei über 200 aktiven Inseraten geriet das Team innerhalb weniger Wochen in Rückstand.

01.
DIE HERAUSFORDERUNG

Manuelles Design im automatisierten Maßstab

Jedes Immobilien-Exposé erforderte eine Titelseite mit Hero-Bild, einen Titelblock mit dynamischer Schriftgrößenanpassung für Titel von 10 bis 90 Zeichen, ein Factsheet mit konfigurierbaren Feldern und bis zu acht zusätzliche Seiten mit Beschreibungen, Grundrissen und Bildergalerien. Das Marketing-Team erstellte diese manuell in InDesign. Ein einzelnes Exposé dauerte 45 Minuten. Aktualisierungen bestehender Inserate erforderten die Neuerstellung des gesamten Dokuments. Es gab keine Versionskontrolle, kein Templating, und stilistische Inkonsistenzen schlichen sich mit jedem neuen Mitarbeiter ein.

45 Minuten pro Exposé, keine Versionskontrolle, und ein Styling, das mit jedem neuen Mitarbeiter driftete. Bei 200 Inseraten war der Rückstand permanent.

02.
DIE LÖSUNG

Prozedurale Dokumentenerzeugung mit ReportLab

Ich habe eine CompanyPDF-Klasse geschrieben, die mehrseitige A4-Dokumente vollständig in Python mit ReportLabs Platypus-Flow-Engine generiert. Die Titelseite berechnet den verfügbaren Platz und verkleinert die Titelschrift in einer Binärsuche-Schleife, bis sie in den vorgesehenen Bereich passt - das PDF-Äquivalent von CSS clamp(). Bilder werden mit Submillimeter-Präzision auf Basis der A4-Koordinatenmathematik angepasst und positioniert. Eine benutzerdefinierte NumberedCanvas-Unterklasse verzögert die Seitennummerierung bis zum finalen save()-Aufruf und ermöglicht so korrekte 'Seite X von Y'-Darstellungen über variabel lange Dokumente.

Dynamische Schriftgrößenanpassung: Eine Schleife verkleinert den Titel, bis er in den Bereich passt:

Python
def _draw_title(self, canvas, title, box_width, box_y):
    font_size = 42  # Start large
    min_size = 16

    while font_size > min_size:
        w = canvas.stringWidth(title, self.font_bold, font_size)
        if w <= box_width:
            break
        font_size -= 0.5

    canvas.setFont(self.font_bold, font_size)
    canvas.drawString(self.margin_left, box_y, title)

Selbst ausprobieren

Gib einen Immobilientitel ein und beobachte, wie die Schriftgröße sich an die Titelbox anpasst. Dies ist exakt der Algorithmus, den der Generator verwendet.

ACME REAL ESTATE
Penthouse Suite with Panoramic ViewsBerlin · 4 Rooms · 142 m²
PRICE€ 1,250,000
AREA142 m²
ROOMS4
42ptrange: 16–42pt

Herausforderungen in der Produktion

Dynamische Schriftgröße

Immobilientitel reichen von 10 bis 90 Zeichen. Eine feste Schriftgröße lässt den Titelbereich entweder überlaufen oder halb leer. Der Generator verwendet eine While-Schleife, die die Schriftgröße in 0,5pt-Schritten verringert, bis stringWidth eine passende Breite meldet. Eine Mindestschriftgröße von 16pt verhindert unleserliche Ergebnisse.

SVG-Logo-Einbettung

Kundenlogos liegen als SVGs vor, aber ReportLabs Canvas kann SVGs nicht nativ rendern. Der Generator konvertiert SVGs mittels svglib in ReportLab-Zeichnungsobjekte und positioniert sie an exakten Koordinaten. Farbüberschreibungen ermöglichen es, dasselbe Logo weiß auf dunklem Hintergrund und in der Original-Markenfarbe auf hellem zu zeigen.

QR-Code-Generierung

Jedes Exposé enthält einen QR-Code mit Link zur Webseite der Immobilie. Der Code wird inline mit der qrcode-Bibliothek generiert, als SVG gerendert, mit einem weißen Hintergrundrechteck gepatcht und dann an fester Position in die Seite eingefügt. Der gesamte Prozess läuft im Speicher. Keine temporären Dateien berühren die Festplatte.

Die NumberedCanvas-Unterklasse für 'Seite X von Y'-Rendering:

Python
class NumberedCanvas(canvas.Canvas):
    """Defers page numbering until save()."""

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._saved_pages = []

    def showPage(self):
        self._saved_pages.append(dict(self.__dict__))
        self._startPage()

    def save(self):
        total = len(self._saved_pages)
        for i, state in enumerate(self._saved_pages, 1):
            self.__dict__.update(state)
            self.setFont("Helvetica", 9)
            self.drawRightString(
                self._pagesize[0] - 30,
                20,
                f"Page {i} of {total}"
            )
            super().showPage()
        super().save()
03.
DAS ERGEBNIS

Von 45 Minuten auf 3 Sekunden

Der automatisierte Generator erstellt ein vollständiges gebrandetes Exposé in unter 3 Sekunden. Aktualisierungen greifen sofort: Inserat ändern, PDF neu generiert sich bei der nächsten Anfrage. Das Marketing-Team hat komplett aufgehört, PDFs zu erstellen. Stilkonsistenz ist garantiert. Das System hat über 18 Monate mehr als 6.000 Dokumente generiert, ohne einen einzigen Layout-Fehler. Ein Debug-Modus mit farbigen Bounding Boxes ermöglicht Entwicklern, Koordinatenmathematik während der Entwicklung visuell zu überprüfen.

WICHTIGE KENNZAHLEN

0<3sGenerierungszeit
0+Generierte Dokumente
0Python-Zeilen
WAS DER KUNDE SAGT

"Wir hatten früher eine Vollzeitkraft nur für die Aktualisierung von Immobilien-PDFs. Jetzt passiert das automatisch und jedes Dokument sieht exakt richtig aus. Wir haben diese Stelle komplett umgewidmet."

Geschäftsführer

Immobilienplattform · Betrieb

FAQ

Warum ReportLab statt wkhtmltopdf oder WeasyPrint?

Wie funktioniert die dynamische Schriftgröße ohne CSS?

Was passiert bei sehr langen Objektbeschreibungen?

TECHNOLOGIE-STACK