202 lines
5.7 KiB
Python
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)
|