Initial commit: PDF zu ICS Konverter
This commit is contained in:
201
menu.py
Normal file
201
menu.py
Normal file
@@ -0,0 +1,201 @@
|
||||
#!/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)
|
||||
Reference in New Issue
Block a user