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:
41
README.md
41
README.md
@@ -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
|
||||||
|
|
||||||
|
|||||||
122
pdf_to_ics.py
122
pdf_to_ics.py
@@ -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"\n▶ Verarbeite: {pdf_file.name}")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Extrahiere Daten
|
# Extrahiere Daten
|
||||||
dienstplan = extract_dienstplan_data(str(pdf_file))
|
dienstplan = extract_dienstplan_data(str(pdf_file))
|
||||||
|
|
||||||
print(f"Name: {dienstplan['vorname']} {dienstplan['name']}")
|
if args.verbose:
|
||||||
print(f"Personalnummer: {dienstplan['personalnummer']}")
|
print(f" Name: {dienstplan['vorname']} {dienstplan['name']}")
|
||||||
print(f"Betriebshof: {dienstplan['betriebshof']}")
|
print(f" Personalnummer: {dienstplan['personalnummer']}")
|
||||||
print(f"Anzahl der Events: {len(dienstplan['events'])}")
|
print(f" Betriebshof: {dienstplan['betriebshof']}")
|
||||||
|
print(f" Anzahl der Events: {len(dienstplan['events'])}")
|
||||||
|
|
||||||
|
if not dienstplan['events']:
|
||||||
|
print(f" ⚠️ Warnung: Keine Events gefunden!")
|
||||||
|
error_count += 1
|
||||||
|
continue
|
||||||
|
|
||||||
# Erstelle ICS-Datei
|
# Erstelle ICS-Datei
|
||||||
ics_path = pdf_file.with_suffix('.ics')
|
ics_filename = pdf_file.stem + '.ics'
|
||||||
create_ics_from_dienstplan(dienstplan, str(ics_path))
|
ics_path = output_dir / ics_filename
|
||||||
|
create_ics_from_dienstplan(dienstplan, str(ics_path), exclude_rest=args.exclude_rest)
|
||||||
|
|
||||||
print(f"✓ ICS-Datei erstellt: {ics_path}")
|
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)}")
|
||||||
import traceback
|
if args.verbose:
|
||||||
traceback.print_exc()
|
import traceback
|
||||||
|
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__':
|
||||||
|
|||||||
Reference in New Issue
Block a user