# PDF-Audit-Export Implementation Guide ## Überblick Das Audit-PDF-Export-System von Invario bietet professionelle, behördengerechte PDF-Reports für deutsche Schulen. Es folgt allen aktuellen Standards für Verwaltungsberichte und ist speziell für Schulträger und Rechnungsprüfungsämter optimiert. ## Installation & Setup ### Schritt 1: Abhängigkeiten installieren ```bash cd Web pip install -r requirements.txt ``` Das System wird bereits mit allen notwendigen Abhängigkeiten ausgeliefert: - `reportlab` - PDF-Generierung - `qrcode` - QR-Code Support - `pillow` - Bildbearbeitung ### Schritt 2: Schulinformationen konfigurieren (optional) Bearbeiten Sie `config.json` und fügen Sie Schulinformationen hinzu: ```json { "school": { "name": "Musterschule", "address": "Schulstraße 123", "postal_code": "12345", "city": "Musterhausen", "school_number": "123456", "it_admin": "John Doe" } } ``` Falls nicht konfiguriert, verwendet das System automatisch Platzhalter. ### Schritt 3: Flask App starten ```bash python app.py ``` Die neuen Export-Funktionen sind sofort verfügbar. ## Verwendung ### Web-Oberfläche 1. Navigieren Sie zum **Audit Dashboard**: `/admin/audit` 2. Klicken Sie auf einen der PDF-Export-Buttons: - **"🚀 Schnell-Check"** - Kompakte Übersicht - **"📋 Amtlicher Bericht"** - Behördenkonformer Report ### API Endpoints #### Quick-Check PDF ``` GET /admin/audit/export/pdf/quick?limit=500 ``` **Parameter:** - `limit` (optional): Anzahl der Einträge (default: 500, max: 5000) **Antwort:** PDF-Datei mit Name `audit-quick-check-YYYYMMDD-HHMMSS.pdf` **Beispiel:** ```bash curl -b cookies.txt "http://localhost:8000/admin/audit/export/pdf/quick?limit=100" \ -o audit-quick.pdf ``` #### Official Report PDF ``` GET /admin/audit/export/pdf/official?limit=1000 ``` **Parameter:** - `limit` (optional): Anzahl der Einträge (default: 1000, max: 5000) **Antwort:** PDF-Datei mit Name `audit-official-report-YYYYMMDD-HHMMSS.pdf` **Beispiel:** ```bash curl -b cookies.txt "http://localhost:8000/admin/audit/export/pdf/official?limit=500" \ -o audit-official.pdf ``` ## Format-Spezifikationen ### Quick-Check Format **Zielgruppe**: Schulverwaltung, Management **Umfang**: - Seiten: 1-2 - Einträge: Letzte 20-500 (einstellbar) - Details: Minimal **Spalten der Audit-Tabelle**: 1. **Index** - Sequenznummer im Audit-Log 2. **Zeit** - Zeitstempel (gekürzt: YYYY-MM-DD HH:MM) 3. **Ereignis** - Ereignistyp 4. **Benutzer** - Benutzer/Actor 5. **Hashwert** - Gekürzte Hash (erste 12 Zeichen) **Zusätzliche Inhalte**: - Schulinformationen (Briefkopf) - Audit-Chain Summary (Status, Einträge, Fehler) - Ereignistyp-Verteilung - DSGVO-Hinweis (Fußzeile) ### Official Report Format **Zielgruppe**: Schulträger, Behörden, Rechnungsprüfungsamt **Umfang**: - Seiten: 2-10+ - Einträge: Alle (bis 1000) - Details: Vollständig **Spalten der Audit-Tabelle**: 1. **Idx** - Chain-Index 2. **Zeitstempel** - ISO 8601 Format (YYYY-MM-DD HH:MM:SS) 3. **Ereignistyp** - Type des Events 4. **Benutzer** - Actor/Benutzer 5. **Quelle** - Source (Web, API, System) 6. **IP-Adresse** - Quell-IP des Events 7. **Hashwert** - Vollständiger Hash (gekürzt angezeigt) **Zusätzliche Inhalte**: - Professioneller Briefkopf (DIN 5008) - Schulinformationen + Schulnummer - Audit-Chain Prüfsummary - Ereignistyp-Verteilung - **Integritätsabweichungen** (bei Fehlern) - **Unterschriftsfeld** für Schulleitung + IT-Beauftragter - DSGVO-Compliance Fußzeile - Technischer Hinweis (PDF/A, revisionssicher) ## DIN 5008 Compliance Details ### Seitenformat - **Größe**: DIN A4 (210 x 297 mm) - **Seitenränder**: - Links: 2,5 cm (Abheften) - Rechts: 1,5 cm - Oben: 4,5 cm (Briefkopf) - Unten: 2,0 cm ### Briefkopf-Bereich (4,5 cm) ``` +-----------------------------------+-----------------------------------+ | Schullogo (optional) | Erstellungsdatum: | | Schulname | Schulnummer: | | Schuladresse | Verantwortliche Person: | | PLZ Stadt | System: Invario v2.6 | +-----------------------------------+-----------------------------------+ ``` ### Schriften - **Header**: Helvetica-Bold, 12pt - **Body Text**: Helvetica, 10pt (min 9pt für Barrierefreiheit) - **Tabellen**: Helvetica, 8-9pt - **Alle**: Serifenlos für maximale Lesbarkeit ### Farben - **Header Hintergrund**: #2c3e50 (dunkelblau) - **Header Text**: Weiß - **OK Status**: Grün mit Text "✓ OK" - **Fehler Status**: Rot mit Text "✗ FEHLER" - **Tabellenzeilen**: Alternierend weiß und hellgrau ### Barrierefreiheit (BFSG) - ✓ Hoher Kontrast (Ratio > 4.5:1) - ✓ Serifenlose Schrift - ✓ Keine reinen Farbcodes - ✓ Logische Tabellenstruktur - ✓ Klare Hierarchie - ✓ Lesbare Schriftgrößen (min 9pt) ## Revisionssicherheit ### Audit-Chain Verifikation Das System zeigt automatisch: - **Chain Status**: OK oder FEHLER - **Gesamteinträge**: Anzahl aller Audit-Logs - **Letzter Index**: Sequenznummer des letzten Eintrags - **Hashwerte**: SHA256-Hashes für Integritätsprüfung - **Integritätsabweichungen**: Auflistung von Fehlern (falls vorhanden) ### Hash-Verifikation Jeder Audit-Eintrag enthält: - `entry_hash`: SHA256 des aktuellen Eintrags - `prev_hash`: SHA256 des vorherigen Eintrags - `chain_index`: Sequenzielle Nummer für Ordnung ### Unterschriftsfeld Der amtliche Report enthält Platz für: - Schulleitung (Unterschrift + Datum) - IT-Beauftragter (Unterschrift + Datum) Dieser Prüfvermerk bestätigt die Richtigkeit und Revisionssicherheit. ## Datenschutz & DSGVO ### DSGVO-Hinweis Alle PDF-Exporte enthalten eine Fußzeile: ``` Dieses Dokument wurde datenschutzkonform erstellt. Speicherung auf zertifizierten Servern in Deutschland. ``` ### Datenschutz-Praktiken - ✓ Keine personenbezogenen Daten in Hashwerten - ✓ IP-Adressen nur für Audit-Zwecke - ✓ Benutzer nur als System-Identifier - ✓ Keine Passwörter oder Secrets im Log - ✓ Payload gekürzt für Datenschutz ### Langzeitarchivierung Die Berichte sind optimiert für: - **PDF/A-Kompatibilität** (30+ Jahre Lesbarkeit) - **Deutsche Behörden** (Bundesarchiv Standard) - **Rechtssicherheit** (gerichtlich verwertbar) ## Technische Architektur ### Klassenliste #### `DIN5008AuditPDF` Hauptklasse für PDF-Generierung **Constructor:** ```python DIN5008AuditPDF(school_info=None, export_type='official') ``` **Parameter:** - `school_info` (dict): Schulinformationen (optional) - `export_type` (str): 'quick' oder 'official' **Methoden:** - `generate_quick_check(verify_result, event_counts, audit_rows)` → PDF bytes - `generate_official_report(verify_result, event_counts, audit_rows)` → PDF bytes **Interne Methoden:** - `_add_header()` - Briefkopf - `_add_title()` - Titel - `_add_audit_summary()` - Zusammenfassung - `_add_events_table()` - Ereignistabelle - `_add_mismatches()` - Fehler-Sektion - `_add_signature_block()` - Unterschriftsfeld - `_add_footer_info()` - DSGVO & Tech-Info - `_create_qr_code()` - QR-Code Generator #### `generate_audit_pdf()` Function Convenience-Funktion für PDF-Generierung ```python generate_audit_pdf( verify_result, # dict - Verifikationsergebnis event_counts, # list - Ereignistypen audit_rows, # list - Audit-Einträge export_type='official', # str school_info=None # dict ) → bytes ``` **Rückgabewert**: PDF als Bytes (bereit zum Download) ### Code-Integration in app.py #### Helper-Funktion ```python def _get_school_info_for_export(): """Lädt Schulinfos aus config.json oder gibt Defaults zurück""" # Implementiert automatisches Fallback ``` #### Route: Quick-Check PDF ```python @app.route('/admin/audit/export/pdf/quick', methods=['GET']) def admin_audit_export_pdf_quick(): # Admin-Check # Audit-Log laden # PDF generieren # Download zurückgeben ``` #### Route: Official Report PDF ```python @app.route('/admin/audit/export/pdf/official', methods=['GET']) def admin_audit_export_pdf_official(): # Admin-Check # Audit-Log laden # PDF generieren # Download zurückgeben ``` ### Template-Integration in admin_audit.html ```html
Information über DIN 5008 Compliance
🚀 Schnell-Check 📋 Amtlicher Bericht
``` ## Fehlerbehandlung ### Häufige Fehler und Lösungen **Fehler: "403 Forbidden"** ``` Ursache: Benutzer ist kein Admin Lösung: Mit Admin-Konto anmelden ``` **Fehler: "500 Internal Server Error"** ``` Ursache: Datenbank-Verbindung fehlt Lösung: MongoDB-Server überprüfen Log: tail -f logs/app.log ``` **Fehler: "PDF scheint beschädigt"** ``` Ursache: Encoding-Problem Lösung: Browser-Cache löschen und erneut versuchen ``` ### Debugging **Log-Datei prüfen:** ```bash tail -f logs/app.log | grep -i "pdf\|export" ``` **Test-PDF generieren:** ```python import sys sys.path.insert(0, 'Web') from pdf_audit_export import generate_audit_pdf test_data = { 'verify_result': {'ok': True, 'count': 0, 'last_chain_index': 0, 'mismatches': []}, 'event_counts': [], 'audit_rows': [], } pdf = generate_audit_pdf(**test_data, export_type='quick') with open('test.pdf', 'wb') as f: f.write(pdf) ``` ## Performance & Optimierung ### Größen - Quick-Check PDF: ~3-5 KB - Official Report PDF: ~4-8 KB pro 100 Einträge - Maximale Größe bei 5000 Einträgen: ~40-50 KB ### Generierungszeit - Quick-Check: <100ms - Official Report (100 Einträge): <200ms - Official Report (1000 Einträge): <500ms ### Optimierungen - Lazy Loading von Audit-Daten - Effiziente Table-Strukturen - Minimale PDF-Größen - Keine unnötigen Bilder/Grafiken ## Geplante Erweiterungen ### Phase 2: Erweiterte Funktionen - [ ] QR-Codes pro Zeile (direkt zu Einträgen) - [ ] Schullogo hochladen - [ ] Digitale PDF-Signaturen - [ ] Mehrsprachige Exporte - [ ] Export-Scheduler (täglich) - [ ] Email-Versand ### Phase 3: Behörden-Integration - [ ] Vollständiges PDF/A-3u Format - [ ] Embedded XML-Metadaten - [ ] Bitonal Font Support - [ ] Archive-Server Integration - [ ] eSignature Integration ## Ressourcen ### Dokumentation - [DIN 5008 Standard](https://www.beuth.de/de/norm/din-5008-1/330274627) - [BFSG - Barrierefreiheitsstärkungsverordnung](https://www.gesetze-im-internet.de/bfsg/) - [DSGVO - Datenschutzgrundverordnung](https://www.gesetze-im-internet.de/dsgvo/) - [ReportLab Dokumentation](https://www.reportlab.com/docs/reportlab-userguide.pdf) ### Support - GitHub Issues: [Link zur Issue-Seite] - Email Support: support@invario.example - Dokumentation: [PDF_AUDIT_EXPORT_DOCUMENTATION.md](PDF_AUDIT_EXPORT_DOCUMENTATION.md) ## Version & Changelog **Version**: 1.0.0 **Release Date**: 10.05.2026 ### Changelog - [1.0.0] Initial Release - ✓ Quick-Check PDF Export - ✓ Official Report PDF Export - ✓ DIN 5008 Compliance - ✓ BFSG Accessibility - ✓ DSGVO Compliance - ✓ Revisionssicherheit ### Kompatibilität - Python: 3.8+ - Flask: 2.0+ - MongoDB: 4.0+ - Browser: Chrome, Firefox, Safari, Edge (alle aktuellen Versionen) ## Lizenz Dieses Modul ist Teil des Invario-Systems und unterliegt der Inventarsystem EULA. Siehe: [Legal/LICENSE](Legal/LICENSE)