#!/usr/bin/env python3 """ Interaktives Menü für PDF zu ICS Konvertierung Benutzerfreundliche Oberfläche zum Verarbeiten von Dienstplan-PDFs """ import os import sys from pathlib import Path from pdf_to_ics import extract_dienstplan_data, create_ics_from_dienstplan def print_header(): """Zeige Programm-Header""" print("\n" + "="*60) print("PDF zu ICS Konverter - Dienstplan Importer".center(60)) print("="*60 + "\n") def print_menu(): """Zeige Hauptmenü""" print("\nHauptmenü:") print("1. PDF(s) konvertieren") print("2. Verzeichnis durchsuchen") print("3. Über dieses Programm") print("4. Beenden") print("-" * 40) def list_pdf_files(): """Liste alle PDF-Dateien im aktuellen Verzeichnis""" pdf_files = list(Path('.').glob('*.pdf')) return pdf_files def convert_pdf(pdf_path): """Konvertiere eine einzelne PDF-Datei""" try: print(f"\n▶ Verarbeite: {pdf_path}") # Extrahiere Daten dienstplan = extract_dienstplan_data(str(pdf_path)) # Zeige Informationen print(f" Name: {dienstplan['vorname']} {dienstplan['name']}") print(f" Personalnummer: {dienstplan['personalnummer']}") print(f" Betriebshof: {dienstplan['betriebshof']}") print(f" Zeitraum: {dienstplan['monat_start']}") print(f" Sollarbeitszeit: {dienstplan['sollarbeitszeit']}") print(f" Events gefunden: {len(dienstplan['events'])}") if not dienstplan['events']: print(" ⚠ Warnung: Keine Events gefunden!") return False # Erstelle ICS-Datei ics_path = pdf_path.with_suffix('.ics') create_ics_from_dienstplan(dienstplan, str(ics_path)) print(f" ✓ ICS-Datei erstellt: {ics_path}") print(f" ✓ Erfolg!\n") return True except Exception as e: print(f" ✗ Fehler: {e}\n") return False def convert_multiple_pdfs(): """Konvertiere mehrere PDF-Dateien""" pdf_files = list_pdf_files() if not pdf_files: print("\n⚠ Keine PDF-Dateien im aktuellen Verzeichnis gefunden!") return print(f"\n✓ {len(pdf_files)} PDF-Datei(en) gefunden:\n") for i, pdf in enumerate(pdf_files, 1): print(f"{i}. {pdf}") print("\n" + "-" * 40) success_count = 0 for pdf in pdf_files: if convert_pdf(pdf): success_count += 1 print(f"\n{'='*40}") print(f"Zusammenfassung: {success_count}/{len(pdf_files)} ICS-Dateien erstellt") print(f"{'='*40}\n") def find_and_show_pdfs(): """Durchsuche Verzeichnis und zeige PDFs""" current_dir = Path('.') print("\n📁 PDF-Dateien in diesem Verzeichnis:") print("-" * 40) pdf_files = list(current_dir.glob('*.pdf')) if not pdf_files: print("Keine PDF-Dateien gefunden.") return for i, pdf in enumerate(pdf_files, 1): size = pdf.stat().st_size size_mb = size / (1024 * 1024) # Versuche Größe lesbar zu machen if size_mb > 1: size_str = f"{size_mb:.2f} MB" else: size_kb = size / 1024 size_str = f"{size_kb:.2f} KB" print(f"{i}. {pdf.name:50} {size_str:>10}") print("-" * 40) print(f"\nGesamt: {len(pdf_files)} PDF-Datei(en)\n") def show_about(): """Zeige Informationen über das Programm""" print(""" ╔═══════════════════════════════════════════════════════════╗ ║ PDF zu ICS Konverter - Dienstplan Importer ║ ║ Version 1.0 ║ ╚═══════════════════════════════════════════════════════════╝ BESCHREIBUNG: Dieses Programm extrahiert Kalenderdaten aus Dienstplan- PDFs und konvertiert sie in das iCalendar-Format (ICS). FEATURES: ✓ Automatische Extraktion von Schichtdaten ✓ Erkennung von Zeitangaben und Nachtschichten ✓ Standard-konforme ICS-Datei-Erstellung ✓ Unterstützung für mehrere PDFs VERWENDETE LIBRARIES: • pdfplumber - PDF-Verarbeitung • icalendar - ICS-Datei-Erstellung • pytz - Zeitzonenverwaltung IMPORT IN KALENDER: Die erstellten ICS-Dateien können in folgende Anwendungen importiert werden: ✓ Outlook ✓ Google Kalender ✓ Apple Kalender (macOS/iOS) ✓ Thunderbird ✓ LibreOffice Kalender ✓ und viele andere... FÜR MEHR INFORMATIONEN: Siehe README.md für ausführliche Dokumentation """) def main(): """Hauptprogramm""" print_header() while True: print_menu() choice = input("Wählen Sie eine Option (1-4): ").strip() if choice == '1': convert_multiple_pdfs() input("Drücken Sie Enter zum Fortfahren...") elif choice == '2': find_and_show_pdfs() input("Drücken Sie Enter zum Fortfahren...") elif choice == '3': show_about() input("Drücken Sie Enter zum Fortfahren...") elif choice == '4': print("\nAuf Wiedersehen! 👋\n") sys.exit(0) else: print("\n✗ Ungültige Auswahl. Bitte versuchen Sie es erneut.") os.system('clear' if os.name == 'posix' else 'cls') print_header() if __name__ == '__main__': try: main() except KeyboardInterrupt: print("\n\n✗ Programm von Benutzer unterbrochen.\n") sys.exit(1)