Migrate all repos into monorepo context folders
Bahn: aisupport, Analyse-O2C-C2S, awesome-bahn-mcp-servers, beam-mcp,
Confluence_Bot, db-planet-mcp-server, O2C-Harness, project-audit,
Projekt-KIQ-HP, teamlandkarte-mcp
Dhive: Jury-Voting
Privat: CV, NoteGraph (NOTE: NoteGraph needs complete redo after consolidation)
Shared: AI-Orchestrator, OrgMyLife, power_skills_and_more
Shared/references: symphony (read-only)
Bahn repos remain available as independent remotes - this monorepo
pulls them in via subtree, the originals are untouched.
This commit is contained in:
@@ -0,0 +1,318 @@
|
||||
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}")
|
||||
Reference in New Issue
Block a user