import os from fpdf import FPDF from fpdf.enums import XPos, YPos # Path configuration for assets BASE_PATH = "src/assets" BG_MAIN = f"{BASE_PATH}/pdf_assets/pitch_deck_bg.png" IMG_USE_CASE = f"{BASE_PATH}/pdf_assets/use_case_ai.png" # USP Images USP_DEV = f"{BASE_PATH}/usp/developer.png" USP_BIZ = f"{BASE_PATH}/usp/business.png" USP_SOV = f"{BASE_PATH}/usp/sovereignty.png" # Style configuration COLOR_BG = (10, 10, 10) COLOR_ACCENT = (0, 255, 0) COLOR_TEXT = (250, 250, 250) COLOR_SECONDARY = (180, 180, 180) class Fancy_KIQ_Deck(FPDF): def add_fancy_bg(self): if os.path.exists(BG_MAIN): self.image(BG_MAIN, x=0, y=0, w=self.w, h=self.h) else: self.set_fill_color(*COLOR_BG) self.rect(0, 0, self.w, self.h, "F") def draw_glass_card(self, x, y, w, h, border=True): # Semi-transparent background with self.local_context(fill_opacity=0.4): self.set_fill_color(20, 20, 20) self.rect(x, y, w, h, "FD" if border else "F", round_corners=True, corner_radius=5) if border: self.set_draw_color(*COLOR_ACCENT) self.set_line_width(0.3) # Subtle glow effect border with self.local_context(stroke_opacity=0.3): self.rect(x-0.5, y-0.5, w+1, h+1, "D", round_corners=True, corner_radius=5) def header(self): if self.page_no() > 1: self.set_font("Helvetica", "B", 8) self.set_text_color(*COLOR_ACCENT) self.set_xy(0, 5) self.cell(287, 8, "PROJEKT-KIQ CONFIDENTIAL", align="R", new_x=XPos.LMARGIN, new_y=YPos.NEXT) def clean_text(text): return (text.replace("\u2014", "-").replace("\u2013", "-") .replace("\u20AC", "EUR").replace("\u2026", "...") .replace("\u00fc", "ue").replace("\u00e4", "ae").replace("\u00f6", "oe") .replace("\u00dc", "Ue").replace("\u00c4", "Ae").replace("\u00d6", "Oe")) def generate_fancy_pdf(): # 16:9 format pdf = Fancy_KIQ_Deck(orientation="L", unit="mm", format=(167, 297)) pdf.set_auto_page_break(auto=True, margin=15) # --- PAGE 1: COVER --- pdf.add_page() pdf.add_fancy_bg() pdf.set_y(65) pdf.set_font("Helvetica", "B", 54) pdf.set_text_color(*COLOR_TEXT) pdf.cell(0, 20, "PROJEKT-KIQ", align="C", new_x=XPos.LMARGIN, new_y=YPos.NEXT) pdf.set_font("Helvetica", "B", 20) pdf.set_text_color(*COLOR_ACCENT) pdf.cell(0, 15, clean_text("Das souveraene KI-Betriebssystem fuer den Mittelstand"), align="C", new_x=XPos.LMARGIN, new_y=YPos.NEXT) pdf.set_y(150) pdf.set_font("Helvetica", "", 10) pdf.set_text_color(*COLOR_SECONDARY) pdf.cell(0, 10, "APRIL 2026 | VERSION 1.3 | CONFIDENTIAL PITCH DECK", align="C") # --- PAGE 2: VISION --- pdf.add_page() pdf.add_fancy_bg() pdf.set_font("Helvetica", "B", 28) pdf.set_text_color(*COLOR_TEXT) pdf.set_xy(10, 10) pdf.cell(0, 20, "Die Plattform-Vision", align="L", new_x=XPos.LMARGIN, new_y=YPos.NEXT) # Vision Cards y_cards = 40 card_w = 88 card_h = 100 usps = [ {"title": "Entwickler", "img": USP_DEV, "text": "Speed & Participation\nShared Benefit Model\nDeutsche KI-Exzellenz"}, {"title": "Unternehmen", "img": USP_BIZ, "text": "Time-to-Value\nKein IT-Overhead\nHigh-End KI ready-to-use"}, {"title": "Souveraenitaet", "img": USP_SOV, "text": "100% Made in Germany\nKeine Hyperscaler-Abh.\nDSGVO-Sicherer Hafen"} ] for i, usp in enumerate(usps): x = 10 + (95 * i) pdf.draw_glass_card(x, y_cards, card_w, card_h) # Image in card if os.path.exists(usp["img"]): pdf.image(usp["img"], x+5, y_cards+5, w=card_w-10, h=40) pdf.set_xy(x+5, y_cards+50) pdf.set_font("Helvetica", "B", 16) pdf.set_text_color(*COLOR_ACCENT) pdf.cell(card_w-10, 10, clean_text(usp["title"]), align="C", new_x=XPos.LMARGIN, new_y=YPos.NEXT) pdf.set_font("Helvetica", "", 12) pdf.set_text_color(*COLOR_TEXT) pdf.set_x(x+5) pdf.multi_cell(card_w-10, 8, clean_text(usp["text"]), align="C") # --- PAGE 3: USE CASES I --- pdf.add_page() pdf.add_fancy_bg() if os.path.exists(IMG_USE_CASE): pdf.image(IMG_USE_CASE, x=160, y=20, h=130) pdf.set_font("Helvetica", "B", 28) pdf.set_text_color(*COLOR_TEXT) pdf.set_xy(10, 10) pdf.cell(0, 20, "KI-Anwendungsfaelle I", align="L", new_x=XPos.LMARGIN, new_y=YPos.NEXT) cases1 = [ ("Teileerkennung", "Auto-Identifikation per Foto. Sekunden statt Minuten Suchzeit."), ("Pruefprotokolle", "QS-Doku aus Auftraegen. Stunden Zeitersparnis pro Auftrag."), ("Marktanalyse", "KI-Monitoring fuer Wettbewerb. Wochenarbeit in Minuten.") ] y_start = 45 for title, desc in cases1: pdf.draw_glass_card(10, y_start, 140, 30) pdf.set_xy(15, y_start+5) pdf.set_font("Helvetica", "B", 14) pdf.set_text_color(*COLOR_ACCENT) pdf.cell(0, 8, clean_text(title), new_x=XPos.LMARGIN, new_y=YPos.NEXT) pdf.set_font("Helvetica", "", 11) pdf.set_text_color(*COLOR_TEXT) pdf.set_x(15) pdf.multi_cell(130, 6, clean_text(desc)) y_start += 35 # --- PAGE 4: USE CASES II --- pdf.add_page() pdf.add_fancy_bg() pdf.set_font("Helvetica", "B", 28) pdf.set_text_color(*COLOR_TEXT) pdf.set_xy(10, 10) pdf.cell(0, 20, "KI-Anwendungsfaelle II", align="L", new_x=XPos.LMARGIN, new_y=YPos.NEXT) cases2 = [ ("Angebotsunterstuetzung", "Komplexe Angebote in Minuten. Hoehere Kapazitaet ohne Personal."), ("Berichtserzeugung", "Automatisierte Reportings. Von 1 Woche auf 30 Minuten."), ("RAG-Chatbot", "Know-how-Chat mit Firmendaten. 100% souveraen und sicher.") ] y_start = 45 for title, desc in cases2: pdf.draw_glass_card(10, y_start, 277, 30) pdf.set_xy(15, y_start+5) pdf.set_font("Helvetica", "B", 14) pdf.set_text_color(*COLOR_ACCENT) pdf.cell(0, 8, clean_text(title), new_x=XPos.LMARGIN, new_y=YPos.NEXT) pdf.set_font("Helvetica", "", 11) pdf.set_text_color(*COLOR_TEXT) pdf.set_x(15) pdf.multi_cell(260, 6, clean_text(desc)) y_start += 35 # --- PAGE 5: TRACTION & METRICS --- pdf.add_page() pdf.add_fancy_bg() pdf.set_font("Helvetica", "B", 28) pdf.set_text_color(*COLOR_TEXT) pdf.set_xy(10, 10) pdf.cell(0, 20, "Traction & Impact", align="L", new_x=XPos.LMARGIN, new_y=YPos.NEXT) metrics = [ ("6", "Zahlende Pilotkunden"), ("60k EUR", "Initialumsatz PoC"), ("12+", "Aktive Use Cases"), ("M15", "Break-Even Prognose") ] for i, (val, label) in enumerate(metrics): x = 10 + (72 * i) pdf.draw_glass_card(x, 60, 65, 50) pdf.set_xy(x, 70) pdf.set_font("Helvetica", "B", 24) pdf.set_text_color(*COLOR_ACCENT) pdf.cell(65, 15, val, align="C", new_x=XPos.LMARGIN, new_y=YPos.NEXT) pdf.set_font("Helvetica", "B", 10) pdf.set_text_color(*COLOR_TEXT) pdf.set_x(x) pdf.cell(65, 10, clean_text(label), align="C") # --- PAGE 6: REVENUE MODELS --- pdf.add_page() pdf.add_fancy_bg() pdf.set_font("Helvetica", "B", 28) pdf.set_text_color(*COLOR_TEXT) pdf.set_xy(10, 10) pdf.cell(0, 20, "Geschaeftsmodell", align="L", new_x=XPos.LMARGIN, new_y=YPos.NEXT) models = [ ("Setup-Fee", "~2.500 EUR", "Initiales Onboarding & Integration."), ("Token-Marge", "20-50% MRR", "Nutzungsbasierte Skalierung."), ("Plattform 80/20", "20% Cut", "Dauerhafte Refinanzierung.") ] for i, (t, s, d) in enumerate(models): pdf.draw_glass_card(10, 45 + (i*35), 200, 30) pdf.set_xy(20, 50 + (i*35)) pdf.set_font("Helvetica", "B", 18) pdf.set_text_color(*COLOR_ACCENT) pdf.cell(80, 10, clean_text(t)) pdf.set_font("Helvetica", "B", 18) pdf.set_text_color(*COLOR_TEXT) pdf.cell(80, 10, clean_text(s), new_x=XPos.LMARGIN, new_y=YPos.NEXT) pdf.set_font("Helvetica", "", 11) pdf.set_x(20) pdf.cell(0, 8, clean_text(d)) # --- PAGE 7: THE ASK (KAPITALBEDARF) --- pdf.add_page() pdf.add_fancy_bg() pdf.set_font("Helvetica", "B", 28) pdf.set_text_color(*COLOR_TEXT) pdf.set_xy(10, 10) pdf.cell(0, 20, "The Ask: Kapitalbedarf Tranche 1", align="L", new_x=XPos.LMARGIN, new_y=YPos.NEXT) pdf.draw_glass_card(10, 45, 277, 100) pdf.set_xy(20, 55) pdf.set_font("Helvetica", "B", 22) pdf.set_text_color(*COLOR_ACCENT) pdf.cell(0, 15, "150.000 EUR Stille Beteiligung", align="L", new_x=XPos.LMARGIN, new_y=YPos.NEXT) allocs = [ ("Runway & Liquiditaetspuffer", "70.000 EUR", 47), ("Go-to-Market (Sales/Marketing)", "50.000 EUR", 33), ("Legal & Zertifizierungen (ISO 27001)", "30.000 EUR", 20) ] y = 75 for label, amount, pct in allocs: pdf.set_xy(20, y) pdf.set_font("Helvetica", "B", 12) pdf.set_text_color(*COLOR_TEXT) pdf.cell(150, 8, clean_text(label)) pdf.set_text_color(*COLOR_ACCENT) pdf.cell(50, 8, amount, align="R", new_x=XPos.LMARGIN, new_y=YPos.NEXT) # Progress Bar simulation pdf.set_draw_color(*COLOR_SECONDARY) pdf.set_fill_color(30, 30, 30) pdf.rect(20, y+8, 250, 3, "F") pdf.set_fill_color(*COLOR_ACCENT) pdf.rect(20, y+8, 250 * (pct/100), 3, "F") y += 18 # --- PAGE 8: TEAM --- pdf.add_page() pdf.add_fancy_bg() pdf.set_font("Helvetica", "B", 28) pdf.set_text_color(*COLOR_TEXT) pdf.set_xy(10, 10) pdf.cell(0, 20, "Das Gruenderteam", align="L", new_x=XPos.LMARGIN, new_y=YPos.NEXT) pdf.draw_glass_card(10, 45, 135, 90) pdf.set_xy(15, 50) pdf.set_font("Helvetica", "B", 18) pdf.set_text_color(*COLOR_ACCENT) pdf.cell(0, 10, "Dr. Andre Knie", new_x=XPos.LMARGIN, new_y=YPos.NEXT) pdf.set_font("Helvetica", "I", 12) pdf.set_text_color(*COLOR_TEXT) pdf.set_x(15) pdf.multi_cell(120, 8, clean_text("Physiker & Leadership-Experte.\nFokus: Mensch-Maschine-Moderation & Strategischer Change.")) pdf.draw_glass_card(152, 45, 135, 90) pdf.set_xy(157, 50) pdf.set_font("Helvetica", "B", 18) pdf.set_text_color(*COLOR_ACCENT) pdf.cell(0, 10, "Dr.-Ing. Alexander Schrodt", new_x=XPos.LMARGIN, new_y=YPos.NEXT) pdf.set_font("Helvetica", "I", 12) pdf.set_text_color(*COLOR_TEXT) pdf.set_x(157) pdf.multi_cell(120, 8, clean_text("Regelungstechniker & Architekt.\nFokus: Mess- und Automatisierungssystemeb & Technische KI-Integration.")) # --- FINAL: CONTACT --- pdf.add_page() pdf.add_fancy_bg() pdf.set_y(60) pdf.set_font("Helvetica", "B", 42) pdf.set_text_color(*COLOR_ACCENT) pdf.cell(0, 30, clean_text("INTERESSE AN PROJEKT-KIQ?"), align="C", new_x=XPos.LMARGIN, new_y=YPos.NEXT) pdf.set_font("Helvetica", "", 18) pdf.set_text_color(*COLOR_TEXT) pdf.cell(0, 15, "Kontakt: KIQ@d-hive.de", align="C", new_x=XPos.LMARGIN, new_y=YPos.NEXT) pdf.cell(0, 15, "www.projekt-kiq.de", align="C") # Output output_path = "docs/Project-KIQ-Pitch-Deck.pdf" if not os.path.exists("docs"): os.makedirs("docs") pdf.output(output_path) return output_path if __name__ == "__main__": path = generate_fancy_pdf() print(f"COMPLETE FANCY PDF generated: {path}")