fix: exakte Header-Höhe für Timeline-Linie prüfen statt fester 40px-Schwelle

Berechnet die tatsächliche Mindesthöhe des nächsten Projekteintrags
(Datum + Rolle + Firma) identisch zur Seitenumbruch-Logik. Verhindert
hängende Linien wenn der nächste Header > 40px hoch ist und eine neue
Seite benötigt.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Thomas Reitz 2026-03-14 15:02:24 +01:00
parent bec770c6ba
commit fb57f5a4dc

View file

@ -568,10 +568,24 @@ export class ProfileExportService {
yRight += 12; yRight += 12;
// Timeline-Linie: nur zeichnen wenn kein Seitenumbruch im Eintrag // Timeline-Linie: nur zeichnen wenn kein Seitenumbruch im Eintrag
// UND der nächste Eintrag noch auf dieser Seite passt (kein hängender Strich) // UND der nächste Eintrag noch auf dieser Seite passt (exakte Header-Höhe prüfen)
if (i < profile.projects.length - 1 && !pageBreakOccurred && yRight + 40 <= pageBottom) { if (i < profile.projects.length - 1 && !pageBreakOccurred) {
doc.moveTo(timelineX, entryStartY + 8).lineTo(timelineX, yRight - 4) const nextProj = profile.projects[i + 1];
.strokeColor(accentColor).lineWidth(1).stroke(); const nextRoleText = this.sanitizePdfText(nextProj.role);
const nextCompanyLine = nextProj.company
? this.sanitizePdfText([nextProj.company, nextProj.industry].filter(Boolean).join(' \u00b7 '))
: '';
doc.font('Helvetica-Bold').fontSize(10);
const nextRoleH = doc.heightOfString(nextRoleText, { width: contentWidth });
doc.fontSize(9);
const nextCompanyH = nextCompanyLine
? doc.heightOfString(nextCompanyLine, { width: contentWidth }) + 2
: 0;
const nextHeaderH = 14 + nextRoleH + 2 + nextCompanyH + 8;
if (yRight + nextHeaderH <= pageBottom) {
doc.moveTo(timelineX, entryStartY + 8).lineTo(timelineX, yRight - 4)
.strokeColor(accentColor).lineWidth(1).stroke();
}
} }
} }
} }