PDF zu ICS Konverter
-PDF hochladen, konvertieren und die ICS-Datei direkt herunterladen.
+PDF hochladen, Vorschau prüfen und herunterladen.
- {% if error %} -diff --git a/web/app.py b/web/app.py index 6fb763b..067822c 100644 --- a/web/app.py +++ b/web/app.py @@ -11,7 +11,7 @@ import os import secrets from fastapi import Depends, FastAPI, File, Form, HTTPException, Request, UploadFile, status -from fastapi.responses import FileResponse, HTMLResponse +from fastapi.responses import FileResponse, HTMLResponse, JSONResponse from fastapi.security import HTTPBasic, HTTPBasicCredentials from fastapi.templating import Jinja2Templates from starlette.background import BackgroundTask @@ -55,6 +55,58 @@ def index(request: Request, _: None = Depends(require_auth)): ) +@app.post("/preview") +async def preview_pdf( + file: UploadFile = File(...), + _: None = Depends(require_auth), +): + filename = file.filename or "dienstplan.pdf" + if not filename.lower().endswith(".pdf"): + return JSONResponse( + {"error": "Bitte eine PDF-Datei hochladen."}, + status_code=400, + ) + + data = await file.read() + if not data: + return JSONResponse( + {"error": "Die Datei ist leer."}, + status_code=400, + ) + + with tempfile.TemporaryDirectory(prefix="pdf_to_ics_web_preview_") as temp_dir: + temp_dir_path = Path(temp_dir) + pdf_path = temp_dir_path / "upload.pdf" + pdf_path.write_bytes(data) + + dienstplan = extract_dienstplan_data(str(pdf_path)) + if not dienstplan.get("events"): + return JSONResponse( + {"error": "Keine Dienstplan-Events in der PDF gefunden."}, + status_code=422, + ) + + events_preview = [] + for event in dienstplan["events"]: + events_preview.append({ + "date": event["date"].strftime("%d.%m.%Y") if event["date"] else "", + "service": event["service"] or "—", + "time": f"{event['start_time']}-{event['end_time']}" if event["start_time"] and event["end_time"] else "—", + }) + + return JSONResponse({ + "success": True, + "filename": filename, + "metadata": { + "name": f"{dienstplan.get('vorname', '')} {dienstplan.get('name', '')}".strip(), + "personalnummer": dienstplan.get("personalnummer", "—"), + "betriebshof": dienstplan.get("betriebshof", "—"), + "count": len(dienstplan["events"]), + }, + "events": events_preview, + }) + + @app.post("/convert") async def convert_pdf( request: Request, diff --git a/web/templates/index.html b/web/templates/index.html index 2944f0b..e8f8ff0 100644 --- a/web/templates/index.html +++ b/web/templates/index.html @@ -6,6 +6,7 @@
PDF hochladen, konvertieren und die ICS-Datei direkt herunterladen.
+PDF hochladen, Vorschau prüfen und herunterladen.
- {% if error %} -