CV-Import: Bewerbungsfoto uebernehmen

This commit is contained in:
2026-09-14 16:24:15 +02:00
parent 0276e5621e
commit b8da5c684b
+35
View File
@@ -81,6 +81,41 @@ Kontakt (`icon_contacts.cv_file`) und lässt sich aus dessen Karte herunterladen
der Download läuft über `fetch` mit Bearer-Kopf, ein normaler Link schickt ihn
nicht mit.
### Das Bewerbungsfoto
Trägt der Lebenslauf ein Portrait, wird es beim Auslesen mit herausgeholt und im
Screening-Formular oben angezeigt – mit Haken, standardmäßig gesetzt. Beim
Übernehmen landet es als Foto am Kontakt.
Gefunden wird es **ohne zusätzliches Paket** (`server/src/cvPhoto.js`):
| Format | Weg |
| --- | --- |
| DOCX | ist ein ZIP – die Dateien unter `word/media/` werden mit dem eingebauten `zlib` herausgelöst |
| PDF | mit `/DCTDecode` abgelegte JPEGs stehen unverändert in der Datei und lassen sich an ihren eigenen Markierungen (FFD8 … FFD9) ausschneiden |
Bilder in anderen PDF-Kodierungen (FlateDecode, also rohe Bitmaps) bleiben außen
vor: sie müssten neu kodiert werden, und dafür bräuchte es eine Bildbibliothek
auf dem Server.
**Welches Bild das Portrait ist**, entscheidet die Form – die Reihenfolge in der
Datei hilft nicht, in DOCX steht das Firmenlogo oft vor dem Foto:
* kleiner als 100 × 100 px → Symbol, Trennlinie, Aufzählungszeichen
* Seitenverhältnis außerhalb 0,4–1,6 → Kopfzeile, Banner, Diagramm
* vom Rest gewinnt **Hochformat** vor Querformat, dann das größere
Verkleinert wird im Browser, über denselben Weg wie jedes andere Foto
(`src/lib/imageCompress.ts`): mittiger Ausschnitt, 400 px im Quadrat, WebP – und
eine harte Obergrenze von **512 kB**, unter die notfalls die Kantenlänge
schrittweise fällt. In der Praxis liegt ein Ergebnis bei 20–60 kB; die Grenze
ist die Zusicherung, nicht die Regel.
Das gefundene Bild liegt bis zur Übernahme in `icon_cv_imports.photo` und wird
danach dort geleert – sonst stünde dasselbe Foto zweimal in der Datenbank. In
der Liste der Importe steht es **nicht**: sie trägt nur `has_photo`, das Bild
holt das Formular einzeln (`GET /api/cvs/:id/photo`).
## Schreibhilfe für Ausschreibungen
Das Feld *Ausschreibungstext* (`icon_tenders.notes`) ist ein WYSIWYG-Editor mit