Files
pdf_to_ics/menu.py

202 lines
5.7 KiB
Python

#!/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)