ich hoffe ich bin hier richtig
![Smile :)](./images/smilies/icon_smile.gif)
Ich habe mit Hilfe von chatgpt einen python code erstellt der eine pdf einliest, auswertet und mir dann eine .ics Datei generiert.
Damit will ich einen Stundenplan ins Kalenderformat bringen.
Das klappt auch soweit ganz gut aber ich habe tatsächlich ein Problem, welches ich auch mit Hilfe der KI nicht gelöst bekomme...
Ich versuche auch hier davon ein Bild hochzuladen aber im Grunde geht es darum, dass auf dem Stundenplan 2 Doppelstunden so dargestellt werden, das dann ein Trennstrich fehlt...
Das bekomme ich aber nicht ausgewertet.
Könnt ihr mir da helfen ?
https://drive.google.com/file/d/1dFkIn3 ... sp=sharing
Mein Code:
Code: Alles auswählen
import pdfplumber
from ics import Calendar, Event
from datetime import datetime, timedelta
from pytz import timezone
# Definiere die Zeitblöcke und Pausen
time_blocks = [
("08:00", "09:30"),
("09:45", "11:15"),
("11:30", "13:00"),
("14:00", "15:30"), # Nach der Mittagspause
]
def parse_pdf(pdf_path):
events = []
start_date = datetime(2024, 6, 3) # Startdatum, das angepasst werden sollte
weekdays = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag"]
with pdfplumber.open(pdf_path) as pdf:
first_page = pdf.pages[0]
tables = first_page.extract_tables()
if tables:
table = tables[0]
# Durchlaufe die Tage von Montag bis Freitag
for day_index, day in enumerate(weekdays):
current_date = start_date + timedelta(days=day_index)
# Durchlaufe die Zeilen jeder Spalte (entsprechend den Stundenblöcken)
for row_index, row in enumerate(table[1:], start=1):
if len(row) > day_index + 1:
cell = row[day_index + 1]
if cell and 'Raum' in cell:
parts = cell.split("\n")
name = parts[0]
room = parts[-1]
# Hole die Start- und Endzeiten basierend auf dem Zeitblock
start_time_str, end_time_str = time_blocks[(row_index - 1) % len(time_blocks)]
event_start = datetime.strptime(f"{current_date.strftime('%Y-%m-%d')} {start_time_str}",
"%Y-%m-%d %H:%M")
event_end = datetime.strptime(f"{current_date.strftime('%Y-%m-%d')} {end_time_str}",
"%Y-%m-%d %H:%M")
# Wenn die Zelle mit der vorherigen übereinstimmt, ist es eine Doppelstunde
if events and events[-1]["name"] == name and events[-1]["location"] == room and events[-1][
"date"] == current_date:
events[-1]["end"] += timedelta(hours=1)
else:
event = {
"name": name,
"start": event_start,
"end": event_end,
"location": room,
"date": current_date
}
events.append(event)
return events
def create_ics(events, output_path):
calendar = Calendar()
for event in events:
e = Event()
e.name = event["name"]
e.location = event["location"]
# Konvertiere die Zeiten in naive datetime-Objekte
start_naive = event["start"].replace(tzinfo=None)
end_naive = event["end"].replace(tzinfo=None)
# Setze die Zeitzone für jedes Ereignis
tz = timezone("Europe/Berlin") # Hier "W. Europe Standard Time" ersetzen
e.begin = tz.localize(start_naive)
e.end = tz.localize(end_naive)
calendar.events.add(e)
with open(output_path, 'w') as file:
file.writelines(calendar)
def main(pdf_path, ics_path):
events = parse_pdf(pdf_path)
create_ics(events, ics_path)
print(f"ICS-Datei wurde erfolgreich erstellt: {ics_path}")
# Beispielnutzung
pdf_path = "C:/tmp/pdf.pdf"
ics_path = "C:/tmp/output.ics"
main(pdf_path, ics_path)