From 66396219af88373505657645f856dc543332bead Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 19 May 2026 09:26:47 +0000 Subject: [PATCH] Place PDF logo at absolute 10mm from top-left, above all content Logo is now pinned to an absolute position (10mm from top, 10mm from left) independent of the content cursor, so it can never overlap any form elements. The cursor y is pushed below the logo bottom before the title and remaining header elements are drawn. https://claude.ai/code/session_016aNBqHpiQciTr1DvNvE7nk --- app/index.html | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app/index.html b/app/index.html index 41948ba..82c2023 100644 --- a/app/index.html +++ b/app/index.html @@ -564,20 +564,24 @@ async function generatePDF() { addPage(true); // Logo + title - let headerBlockH = szLg; + const mm10 = 10 * 2.83465; // 10 mm in points if (logoImage) { const maxW = (CFG['logo-maxwidth'] || 4) * 28.3465; const scale = Math.min(maxW / logoImage.width, 50 / logoImage.height, 1); const lw = logoImage.width * scale, lhh = logoImage.height * scale; - pg.drawImage(logoImage, { x: M.left, y: y - lhh, width: lw, height: lhh }); - headerBlockH = Math.max(lhh, szLg); + // Absolute position: 10 mm from top-left, above all other content + const logoTop = pageH - mm10; + pg.drawImage(logoImage, { x: mm10, y: logoTop - lhh, width: lw, height: lhh }); + // Push cursor below logo with a small gap before remaining header elements + y = Math.min(y, logoTop - lhh - 8); } else if (CFG.organization) { pg.drawText(CFG.organization, { x: M.left, y, size: szLg, font: fontBold, color: accent }); + y -= szLg + 8; } const titleStr = 'REIMBURSEMENT FORM'; const tw = fontBold.widthOfTextAtSize(titleStr, szLg); - pg.drawText(titleStr, { x: M.left + W - tw, y: y - szLg, size: szLg, font: fontBold, color: accent }); - y -= headerBlockH + 8; + pg.drawText(titleStr, { x: M.left + W - tw, y, size: szLg, font: fontBold, color: accent }); + y -= szLg + 8; // Intro text if (CFG.intro) {