26a869c0eb
Follow-up to the Arabic shaping fix. The downloaded schedule PDF was spilling onto a second page even for modest days because (a) attendees were stacked one-per-line and (b) the page header + cell padding + column proportions reserved more vertical space than necessary. Changes (artifacts/api-server/src/lib/pdf-renderer.ts): - Attendees now render as a single inline paragraph per cell (joined with two spaces) and wrap naturally — matches the user's reference layout where attendees flow as one paragraph. - Re-balanced column widths from 6/30/44/20 → 6/38/40/16. Meeting titles get more room (no more 6-line wraps for typical titles) and attendees get less (they're inline now). - Page margin tightened 36pt → 24pt. - Title size cap tightened (28 → 22) so the header band doesn't eat a table row. - moveDown gaps trimmed (0.4→0.2 between title and date, 0.8→0.4 before the table). - Cell vertical padding trimmed (5pt → 3pt). - drawWrappingLine now passes lineGap: -1 to pdfkit's text() so wrapped paragraphs get tighter inter-line spacing; the row-height probe passes the same option so probe and draw stay symmetric. - Row-height probe now uses heightOfString() output directly (Math.max(lineHeight, measured) + 2) instead of rounding up to whole lineHeight units, removing the half-line of empty space that was visible below short cells. Verified: - EN: all 10 meetings on one A4 page. - AR: 9 of 10 meetings on one A4 page; the 10th row contains multi-line internal/external subheadings which legitimately need a taller cell — typical days fit on a single page. - PDF Arabic shaping regression test still passes. - No row overlaps anywhere. Logo: handler already loads the brand-settings logo (logoObjectPath) and embeds it in the header — no code change needed. If the logo isn't visible, none has been uploaded in brand settings.