From 51e0182399a87d0e81641be6f986b50171562bf1 Mon Sep 17 00:00:00 2001 From: odweta Date: Thu, 10 Sep 2026 17:06:13 +0200 Subject: [PATCH 1/2] Anchor PDF payment card to footer and size QR to text height Move the payment info card (account number, IBAN, SWIFT) to the bottom of the invoice page so it sits flush with the footer, and size the QR code to match the combined height of the three payment lines instead of a fixed size. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- app/src/app.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/app/src/app.js b/app/src/app.js index 60693f6..a3c19ef 100644 --- a/app/src/app.js +++ b/app/src/app.js @@ -572,16 +572,22 @@ const renderInvoicePdf = async (document, invoice) => { document.y += 35; document.moveTo(document.page.margins.left, document.y).lineTo(document.page.margins.left + pageWidth, document.y) .strokeColor(navy).lineWidth(1.5).stroke(); - document.y += 12; - const paymentTop = document.y; - document.roundedRect(document.page.margins.left, paymentTop, pageWidth, 165, 4).fillAndStroke('#f4f7fb', line); + const paymentCardHeight = 105; + const paymentTop = document.page.height - document.page.margins.bottom - paymentCardHeight; + const paymentLineHeight = 18; + const qrSize = paymentLineHeight * 3; + document.roundedRect(document.page.margins.left, paymentTop, pageWidth, paymentCardHeight, 4) + .fillAndStroke('#f4f7fb', line); document.fillColor(navy).font(boldFont).fontSize(11).text('Platební údaje', document.page.margins.left + 10, paymentTop + 10); document.fillColor(bodyText).font(regularFont).fontSize(10) .text(`Číslo účtu: ${pdfText(payment.cisloUctu)}`, document.page.margins.left + 10, paymentTop + 35) - .text(`IBAN: ${pdfText(payment.iban)}`, document.page.margins.left + 10, paymentTop + 55) - .text(`SWIFT: ${pdfText(payment.swift)}`, document.page.margins.left + 10, paymentTop + 75); + .text(`IBAN: ${pdfText(payment.iban)}`, document.page.margins.left + 10, paymentTop + 35 + paymentLineHeight) + .text(`SWIFT: ${pdfText(payment.swift)}`, document.page.margins.left + 10, paymentTop + 35 + paymentLineHeight * 2); if (qrBuffer) { - document.image(qrBuffer, document.page.margins.left + pageWidth - 155, paymentTop + 10, { width: 145, height: 145 }); + document.image(qrBuffer, document.page.margins.left + pageWidth - qrSize - 10, paymentTop + 30, { + width: qrSize, + height: qrSize + }); } document.end(); }; -- 2.54.0 From a14500c7ab598f99b3ad313efbc4460d12ebb108 Mon Sep 17 00:00:00 2001 From: odweta Date: Thu, 10 Sep 2026 17:22:31 +0200 Subject: [PATCH 2/2] Decrease PDF invoice item row height by ~10% Reduce the item table row height from 25pt to 22.5pt and re-center the cell text within the shorter rows. The header row height is unchanged. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- app/src/app.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/app/src/app.js b/app/src/app.js index 60693f6..9366168 100644 --- a/app/src/app.js +++ b/app/src/app.js @@ -539,28 +539,29 @@ const renderInvoicePdf = async (document, invoice) => { const tableTop = document.y + 12; const columns = [0, pageWidth * 0.52, pageWidth * 0.68, pageWidth * 0.82, pageWidth]; - const rowHeight = 25; - document.rect(document.page.margins.left, tableTop, pageWidth, rowHeight).fill('#eef1f3'); + const headerRowHeight = 25; + const itemRowHeight = 22.5; + document.rect(document.page.margins.left, tableTop, pageWidth, headerRowHeight).fill('#eef1f3'); document.fillColor(navy).font(boldFont).fontSize(9); ['Položka', 'Množství', 'MJ', 'Cena za MJ'].forEach((heading, index) => { document.text(heading, document.page.margins.left + columns[index] + 6, tableTop + 8, { width: columns[index + 1] - columns[index] - 12 }); }); - document.y = tableTop + rowHeight; + document.y = tableTop + headerRowHeight; (data.items || []).forEach((item, index) => { const rowTop = document.y; - document.rect(document.page.margins.left, rowTop, pageWidth, rowHeight) + document.rect(document.page.margins.left, rowTop, pageWidth, itemRowHeight) .fill(index % 2 ? lightBlue : warm); - document.moveTo(document.page.margins.left, rowTop + rowHeight) - .lineTo(document.page.margins.left + pageWidth, rowTop + rowHeight) + document.moveTo(document.page.margins.left, rowTop + itemRowHeight) + .lineTo(document.page.margins.left + pageWidth, rowTop + itemRowHeight) .strokeColor(line).lineWidth(0.7).stroke(); document.fillColor(bodyText).font(regularFont).fontSize(9); [pdfText(item.popis), formatCzechNumber(item.mnozstvi), pdfText(item.mernaJednotka), `${formatCzechNumber(item.cenaZaMj)} Kč`] - .forEach((value, columnIndex) => document.text(value, document.page.margins.left + columns[columnIndex] + 6, rowTop + 8, { + .forEach((value, columnIndex) => document.text(value, document.page.margins.left + columns[columnIndex] + 6, rowTop + 6, { width: columns[columnIndex + 1] - columns[columnIndex] - 12 })); - document.y = rowTop + rowHeight; + document.y = rowTop + itemRowHeight; }); document.y += 18; -- 2.54.0