feat: CLI-Argumente und verbesserte Kommandozeilenverarbeitung

- Add argparse für flexible CLI-Optionen
- Add --input/-i für Eingabe-Verzeichnis
- Add --output/-o für Ausgabe-Verzeichnis
- Add --exclude-rest/-e für Ruhetage ausschließen
- Add --verbose/-v für detaillierte Ausgabe
- Unterstütze einzelne Datei als Argument
- Bessere Fehlerbehandlung und Zusammenfassung
- Update README.md mit CLI-Dokumentation und Beispielen
- Add Optionen-Tabelle für schnelle Referenz
This commit is contained in:
2026-02-23 20:01:10 +01:00
parent fde69adcec
commit d1d1788a3c
2 changed files with 145 additions and 18 deletions

View File

@@ -98,16 +98,51 @@ pip install pdfplumber icalendar pypdf2 pytz
## Verwendung ## Verwendung
### Schnellstart ### Schnellstart (CLI)
1. Kopieren Sie Ihre Dienstplan-PDF-Dateien in dieses Verzeichnis 1. Kopieren Sie Ihre Dienstplan-PDF-Dateien in ein Verzeichnis
2. Führen Sie das Skript aus: 2. Führen Sie das Skript aus:
```bash ```bash
python3 pdf_to_ics.py python3 pdf_to_ics.py
``` ```
Das Tool findet automatisch alle `.pdf` Dateien und erstellt entsprechende `.ics` Dateien. Das Tool findet automatisch alle `.pdf` Dateien im aktuellen Verzeichnis und erstellt entsprechende `.ics` Dateien.
### Kommandozeilen-Optionen
```bash
# Alle PDFs im aktuellen Verzeichnis konvertieren
python3 pdf_to_ics.py
# PDFs aus einem bestimmten Verzeichnis konvertieren
python3 pdf_to_ics.py --input ./pdfs
# PDFs in anderes Verzeichnis speichern
python3 pdf_to_ics.py --input ./pdfs --output ./ics_dateien
# Ruhetage ausschließen
python3 pdf_to_ics.py --exclude-rest
# Einzelne PDF-Datei konvertieren
python3 pdf_to_ics.py /pfad/zur/datei.pdf
# Mit detaillierter Ausgabe
python3 pdf_to_ics.py --input ./pdfs -v
# Hilfe anzeigen
python3 pdf_to_ics.py --help
```
**Verfügbare Optionen:**
| Option | Kurzform | Beschreibung |
|--------|----------|-------------|
| `--input DIR` | `-i` | Eingabe-Verzeichnis mit PDF-Dateien (Standard: aktuelles Verzeichnis) |
| `--output DIR` | `-o` | Ausgabe-Verzeichnis für ICS-Dateien (Standard: Eingabe-Verzeichnis) |
| `--exclude-rest` | `-e` | Ruhetage ausschließen (Ruhe, R56, R36, vRWF48, RWE, vR48) |
| `--verbose` | `-v` | Detaillierte Ausgabe anzeigen |
| `--help` | `-h` | Hilfe anzeigen |
### Erweiterte Nutzung ### Erweiterte Nutzung

View File

@@ -255,39 +255,131 @@ def create_ics_from_dienstplan(dienstplan, output_path=None, exclude_rest=False)
def main(): def main():
""" """
Hauptfunktion Hauptfunktion mit CLI-Argumenten
""" """
import sys import sys
import argparse
# Finde alle PDF-Dateien im aktuellen Verzeichnis parser = argparse.ArgumentParser(
pdf_files = list(Path('.').glob('*.pdf')) description='PDF zu ICS Konverter - Konvertiere Dienstplan-PDFs zu iCalendar-Dateien',
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
Beispiele:
python3 pdf_to_ics.py # Konvertiere alle PDFs im aktuellen Verzeichnis
python3 pdf_to_ics.py --input ./pdfs --output ./ics # PDFs aus ./pdfs → ICS zu ./ics
python3 pdf_to_ics.py --input ./pdfs --exclude-rest # Schließe Ruhetage aus
python3 pdf_to_ics.py file.pdf # Konvertiere einzelne Datei
"""
)
parser.add_argument(
'pdf_file',
nargs='?',
help='Einzelne PDF-Datei zum Konvertieren (optional)'
)
parser.add_argument(
'-i', '--input',
type=str,
default='.',
help='Eingabe-Verzeichnis mit PDF-Dateien (Standard: aktuelles Verzeichnis)'
)
parser.add_argument(
'-o', '--output',
type=str,
help='Ausgabe-Verzeichnis für ICS-Dateien (Standard: Eingabe-Verzeichnis)'
)
parser.add_argument(
'-e', '--exclude-rest',
action='store_true',
help='Ruhetage ausschließen (Ruhe, R56, R36, vRWF48, RWE, vR48)'
)
parser.add_argument(
'-v', '--verbose',
action='store_true',
help='Detaillierte Ausgabe'
)
args = parser.parse_args()
# Bestimme Eingabe-Verzeichnis
if args.pdf_file:
# Einzelne Datei
pdf_file = Path(args.pdf_file)
if not pdf_file.exists():
print(f"✗ Fehler: Datei nicht gefunden: {pdf_file}")
sys.exit(1)
pdf_files = [pdf_file]
input_dir = pdf_file.parent
else:
# Verzeichnis
input_dir = Path(args.input)
if not input_dir.exists():
print(f"✗ Fehler: Verzeichnis nicht gefunden: {input_dir}")
sys.exit(1)
pdf_files = sorted(input_dir.glob('*.pdf'))
# Bestimme Ausgabe-Verzeichnis
output_dir = Path(args.output) if args.output else input_dir
output_dir.mkdir(parents=True, exist_ok=True)
if not pdf_files: if not pdf_files:
print("Keine PDF-Dateien gefunden!") print(f"Keine PDF-Dateien gefunden in: {input_dir}")
return return
if args.verbose:
print(f"📂 Eingabe-Verzeichnis: {input_dir}")
print(f"📂 Ausgabe-Verzeichnis: {output_dir}")
print(f"📄 PDF-Dateien gefunden: {len(pdf_files)}")
if args.exclude_rest:
print("🧘 Ruhetage werden ausgeschlossen")
print()
success_count = 0
error_count = 0
for pdf_file in pdf_files: for pdf_file in pdf_files:
print(f"\nVerarbeite: {pdf_file}") print(f"\nVerarbeite: {pdf_file.name}")
try: try:
# Extrahiere Daten # Extrahiere Daten
dienstplan = extract_dienstplan_data(str(pdf_file)) dienstplan = extract_dienstplan_data(str(pdf_file))
if args.verbose:
print(f" Name: {dienstplan['vorname']} {dienstplan['name']}") print(f" Name: {dienstplan['vorname']} {dienstplan['name']}")
print(f" Personalnummer: {dienstplan['personalnummer']}") print(f" Personalnummer: {dienstplan['personalnummer']}")
print(f" Betriebshof: {dienstplan['betriebshof']}") print(f" Betriebshof: {dienstplan['betriebshof']}")
print(f" Anzahl der Events: {len(dienstplan['events'])}") print(f" Anzahl der Events: {len(dienstplan['events'])}")
# Erstelle ICS-Datei if not dienstplan['events']:
ics_path = pdf_file.with_suffix('.ics') print(f" ⚠️ Warnung: Keine Events gefunden!")
create_ics_from_dienstplan(dienstplan, str(ics_path)) error_count += 1
continue
print(f"✓ ICS-Datei erstellt: {ics_path}") # Erstelle ICS-Datei
ics_filename = pdf_file.stem + '.ics'
ics_path = output_dir / ics_filename
create_ics_from_dienstplan(dienstplan, str(ics_path), exclude_rest=args.exclude_rest)
print(f" ✓ ICS erstellt: {ics_path}")
success_count += 1
except Exception as e: except Exception as e:
print(f"✗ Fehler bei {pdf_file}: {e}") print(f" ✗ Fehler: {str(e)}")
if args.verbose:
import traceback import traceback
traceback.print_exc() traceback.print_exc()
error_count += 1
# Zusammenfassung
print("\n" + "="*50)
print(f"✅ Fertig!")
print(f" Erfolgreich: {success_count}")
print(f" Fehler: {error_count}")
print("="*50)
if __name__ == '__main__': if __name__ == '__main__':