'use client' /** * Magic Help - Handschrift-OCR * * Ermöglicht das Erkennen von Handschrift in Bildern. * Backend: POST /api/klausur/trocr/recognize */ import { useState, useCallback } from 'react' // Backend URL - dynamisch basierend auf Protokoll const getBackendUrl = () => { if (typeof window === 'undefined') return 'http://localhost:8000' const { hostname, protocol } = window.location return hostname === 'localhost' ? 'http://localhost:8000' : `${protocol}//${hostname}:8000` } interface OCRResult { text: string confidence: number processing_time_ms: number model: string } export default function MagicHelpPage() { const [selectedFile, setSelectedFile] = useState(null) const [previewUrl, setPreviewUrl] = useState(null) const [ocrResult, setOcrResult] = useState(null) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) // Datei auswählen const handleFileSelect = useCallback((e: React.ChangeEvent) => { const file = e.target.files?.[0] if (file) { setSelectedFile(file) setPreviewUrl(URL.createObjectURL(file)) setOcrResult(null) setError(null) } }, []) // Drag & Drop const handleDrop = useCallback((e: React.DragEvent) => { e.preventDefault() const file = e.dataTransfer.files[0] if (file && file.type.startsWith('image/')) { setSelectedFile(file) setPreviewUrl(URL.createObjectURL(file)) setOcrResult(null) setError(null) } }, []) const handleDragOver = useCallback((e: React.DragEvent) => { e.preventDefault() }, []) // OCR ausführen const runOCR = useCallback(async () => { if (!selectedFile) return setLoading(true) setError(null) try { const formData = new FormData() formData.append('file', selectedFile) const res = await fetch(`${getBackendUrl()}/api/klausur/trocr/recognize`, { method: 'POST', body: formData, }) if (!res.ok) { throw new Error(`HTTP ${res.status}: ${res.statusText}`) } const data = await res.json() setOcrResult(data) } catch (err) { setError(err instanceof Error ? err.message : 'Fehler bei der OCR-Erkennung') } finally { setLoading(false) } }, [selectedFile]) // Reset const handleReset = useCallback(() => { setSelectedFile(null) setPreviewUrl(null) setOcrResult(null) setError(null) }, []) return (
{/* Header */}

Magic Help

Handschrift-Erkennung mit TrOCR

{/* Upload Area */}

Bild hochladen

{!previewUrl ? (
) : (
{/* Preview */}
Preview
{/* Actions */}
)}
{/* Error */} {error && (

Fehler

{error}

)} {/* Result */} {ocrResult && (

Erkannter Text

{/* Text Output */}
{ocrResult.text || '(Kein Text erkannt)'}
{/* Stats */}
Konfidenz
{(ocrResult.confidence * 100).toFixed(1)}%
Dauer
{ocrResult.processing_time_ms}ms
Modell
{ocrResult.model}
{/* Copy Button */}
)} {/* Info Box */} {!previewUrl && !ocrResult && (

Tipp

Laden Sie ein Bild mit handgeschriebenem Text hoch. Der TrOCR-Dienst erkennt deutsche Handschrift und gibt den Text zurück.

)}
) }