From a30692a05391eb33d9ba33e992fc4b638d42322a Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Tue, 12 May 2026 23:00:07 +0200 Subject: [PATCH] Update package version to 1.2.0, enhance fillable template generation with underlined text fields, and update PDF templates - Bumped the package version to 1.2.0 in package.json. - Refactored the fillable template generation script to use a new function for creating underlined text fields, improving code readability and maintainability. - Updated the membership and membership fillable PDF templates to reflect changes in the form fields. --- package.json | 2 +- .../beitrittserklärung_template.pdf | Bin 35229 -> 17387 bytes scripts/create-fillable-template.js | 83 +++++++++++++----- server/templates/mitgliedschaft-fillable.pdf | Bin 17581 -> 17387 bytes 4 files changed, 61 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index 2bd303e..d4ced3e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "harheimertc-website", - "version": "1.1.6", + "version": "1.2.0", "description": "Moderne Webseite für den Harheimer Tischtennis Club", "private": true, "type": "module", diff --git a/public/documents/beitrittserklärung_template.pdf b/public/documents/beitrittserklärung_template.pdf index 1047192e94812357565693cb11d4ff8ca45746c8..c4f121619f162bd54bbf885d037b9fa24fe5a229 100644 GIT binary patch literal 17387 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 QSO^Tx%L8Cyl2VrbFBfUQCjbBd literal 35229 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 { + const { + x, + y, + width: fieldW, + height: fieldH, + font, + drawUnderline = true, + lineOffset = 1, + lineHeight = 0.7 + } = options + + if (drawUnderline) { + targetPage.drawRectangle({ + x, + y: y + lineOffset, + width: fieldW, + height: lineHeight, + color: rgb(0, 0, 0) + }) + } + + return form.createTextField(name).addToPage(targetPage, { + x, + y, + width: fieldW, + height: fieldH, + font, + borderWidth: 0, + borderColor: undefined, + backgroundColor: undefined + }) + } // Place fields on the same baseline as their labels // We need to move only the input fields on page 1 up by 0.6cm (≈17.01pt) without moving labels. const labelToFieldYDelta = 2 // small vertical offset so field baseline matches label visually const lift = 0 // original lift value // previously raised inputs by 17.01pt (0.6cm); move them down by 5.67pt (0.2cm) const inputFieldRaise = 11.34 // net upward offset now ~11.34pt - form.createTextField('nachname').addToPage(page, { x: leftX + fieldXOffset, y: baseY - fieldHeight + labelToFieldYDelta + lift + fieldsShift + labelsShift + inputFieldRaise, width: Math.round(fieldWidth * fieldShrinkFactor), height: fieldHeight, font: helv }) - form.createTextField('vorname').addToPage(page, { x: rightX + fieldXOffset, y: baseY - fieldHeight + labelToFieldYDelta + lift + fieldsShift + labelsShift + inputFieldRaise, width: Math.round(fieldWidth * fieldShrinkFactor), height: fieldHeight, font: helv }) - form.createTextField('strasse').addToPage(page, { x: leftX + fieldXOffset, y: baseY - gap - fieldHeight + labelToFieldYDelta + lift + fieldsShift + labelsShift + inputFieldRaise, width: Math.round(fieldWidth * fieldShrinkFactor), height: fieldHeight, font: helv }) - form.createTextField('plz_ort').addToPage(page, { x: rightX + fieldXOffset, y: baseY - gap - fieldHeight + labelToFieldYDelta + lift + fieldsShift + labelsShift + inputFieldRaise, width: Math.round(fieldWidth * fieldShrinkFactor), height: fieldHeight, font: helv }) - form.createTextField('geburtsdatum').addToPage(page, { x: leftX + fieldXOffset, y: baseY - gap * 2 - fieldHeight + labelToFieldYDelta + lift + fieldsShift + labelsShift + inputFieldRaise, width: Math.round(fieldWidth * fieldShrinkFactor), height: fieldHeight, font: helv }) - form.createTextField('telefon').addToPage(page, { x: rightX + fieldXOffset, y: baseY - gap * 2 - fieldHeight + labelToFieldYDelta + lift + fieldsShift + labelsShift + inputFieldRaise, width: Math.round(fieldWidth * fieldShrinkFactor), height: fieldHeight, font: helv }) - form.createTextField('email').addToPage(page, { x: leftX + fieldXOffset, y: baseY - gap * 3 - fieldHeight + labelToFieldYDelta + lift + fieldsShift + labelsShift + inputFieldRaise, width: Math.round(fieldWidth * fieldShrinkFactor), height: fieldHeight, font: helv }) - form.createTextField('telefon_mobil').addToPage(page, { x: rightX + fieldXOffset, y: baseY - gap * 3 - fieldHeight + labelToFieldYDelta + lift + fieldsShift + labelsShift + inputFieldRaise, width: Math.round(fieldWidth * fieldShrinkFactor), height: fieldHeight, font: helv }) + createUnderlinedTextField('nachname', page, { x: leftX + fieldXOffset, y: baseY - fieldHeight + labelToFieldYDelta + lift + fieldsShift + labelsShift + inputFieldRaise, width: Math.round(fieldWidth * fieldShrinkFactor), height: fieldHeight, font: helv }) + createUnderlinedTextField('vorname', page, { x: rightX + fieldXOffset, y: baseY - fieldHeight + labelToFieldYDelta + lift + fieldsShift + labelsShift + inputFieldRaise, width: Math.round(fieldWidth * fieldShrinkFactor), height: fieldHeight, font: helv }) + createUnderlinedTextField('strasse', page, { x: leftX + fieldXOffset, y: baseY - gap - fieldHeight + labelToFieldYDelta + lift + fieldsShift + labelsShift + inputFieldRaise, width: Math.round(fieldWidth * fieldShrinkFactor), height: fieldHeight, font: helv }) + createUnderlinedTextField('plz_ort', page, { x: rightX + fieldXOffset, y: baseY - gap - fieldHeight + labelToFieldYDelta + lift + fieldsShift + labelsShift + inputFieldRaise, width: Math.round(fieldWidth * fieldShrinkFactor), height: fieldHeight, font: helv }) + createUnderlinedTextField('geburtsdatum', page, { x: leftX + fieldXOffset, y: baseY - gap * 2 - fieldHeight + labelToFieldYDelta + lift + fieldsShift + labelsShift + inputFieldRaise, width: Math.round(fieldWidth * fieldShrinkFactor), height: fieldHeight, font: helv }) + createUnderlinedTextField('telefon', page, { x: rightX + fieldXOffset, y: baseY - gap * 2 - fieldHeight + labelToFieldYDelta + lift + fieldsShift + labelsShift + inputFieldRaise, width: Math.round(fieldWidth * fieldShrinkFactor), height: fieldHeight, font: helv }) + createUnderlinedTextField('email', page, { x: leftX + fieldXOffset, y: baseY - gap * 3 - fieldHeight + labelToFieldYDelta + lift + fieldsShift + labelsShift + inputFieldRaise, width: Math.round(fieldWidth * fieldShrinkFactor), height: fieldHeight, font: helv }) + createUnderlinedTextField('telefon_mobil', page, { x: rightX + fieldXOffset, y: baseY - gap * 3 - fieldHeight + labelToFieldYDelta + lift + fieldsShift + labelsShift + inputFieldRaise, width: Math.round(fieldWidth * fieldShrinkFactor), height: fieldHeight, font: helv }) // read membership amounts from config (fall back to defaults) let erw = 120, jug = 72, passv = 30 @@ -176,7 +209,7 @@ async function create() { const dateRaise = 11.34 // For page 1 we need to move only the date input up by 5.2mm (≈14.739pt) const signDatumExtraRaise = 14.739 - form.createTextField('sign_datum').addToPage(page, { x: dateFieldX, y: signatureLineY - fieldHeight + signDatumExtraRaise, width: dateFieldWidth, height: fieldHeight, font: helv }) + createUnderlinedTextField('sign_datum', page, { x: dateFieldX, y: signatureLineY - fieldHeight + signDatumExtraRaise, width: dateFieldWidth, height: fieldHeight, font: helv, drawUnderline: false }) // second signature line 3cm below first const threeCm = 85.04 const secondY = signY - threeCm @@ -268,32 +301,32 @@ async function create() { // apply labelsShift only to the SEPA form labels/inputs so paragraphs remain unaffected let syFields = sy + labelsShift page2.drawText('Mitglied (Vorname und Name)', { x: sepaLeft + labelOffset, y: syFields, size: small, font: helv }) - form.createTextField('sepa_mitglied').addToPage(page2, { x: inputX, y: syFields - fieldHeight2 + 2 + inputYAdjust - page2DownShift, width: Math.round(fieldWidth2 * fieldShrinkFactor), height: fieldHeight2, font: helv }) + createUnderlinedTextField('sepa_mitglied', page2, { x: inputX, y: syFields - fieldHeight2 + 2 + inputYAdjust - page2DownShift, width: Math.round(fieldWidth2 * fieldShrinkFactor), height: fieldHeight2, font: helv }) syFields -= lineGap * 1.1 page2.drawText('Kontoinhaber (Vorname und Name):', { x: sepaLeft + labelOffset, y: syFields, size: small, font: helv }) - form.createTextField('sepa_kontoinhaber').addToPage(page2, { x: inputX, y: syFields - fieldHeight2 + 2 + inputYAdjust - page2DownShift, width: Math.round(fieldWidth2 * fieldShrinkFactor), height: fieldHeight2, font: helv }) + createUnderlinedTextField('sepa_kontoinhaber', page2, { x: inputX, y: syFields - fieldHeight2 + 2 + inputYAdjust - page2DownShift, width: Math.round(fieldWidth2 * fieldShrinkFactor), height: fieldHeight2, font: helv }) syFields -= lineGap * 1.1 page2.drawText('Straße und Hausnummer:', { x: sepaLeft + labelOffset, y: syFields, size: small, font: helv }) - form.createTextField('sepa_strasse').addToPage(page2, { x: inputX, y: syFields - fieldHeight2 + 2 + inputYAdjust - page2DownShift, width: Math.round(fieldWidth2 * fieldShrinkFactor), height: fieldHeight2, font: helv }) + createUnderlinedTextField('sepa_strasse', page2, { x: inputX, y: syFields - fieldHeight2 + 2 + inputYAdjust - page2DownShift, width: Math.round(fieldWidth2 * fieldShrinkFactor), height: fieldHeight2, font: helv }) syFields -= lineGap * 1.1 page2.drawText('PLZ und Ort:', { x: sepaLeft + labelOffset, y: syFields, size: small, font: helv }) - form.createTextField('sepa_plz_ort').addToPage(page2, { x: inputX, y: syFields - fieldHeight2 + 2 + inputYAdjust - page2DownShift, width: Math.round(fieldWidth2 * fieldShrinkFactor), height: fieldHeight2, font: helv }) + createUnderlinedTextField('sepa_plz_ort', page2, { x: inputX, y: syFields - fieldHeight2 + 2 + inputYAdjust - page2DownShift, width: Math.round(fieldWidth2 * fieldShrinkFactor), height: fieldHeight2, font: helv }) syFields -= lineGap * 1.1 page2.drawText('Kreditinstitut:', { x: sepaLeft + labelOffset, y: syFields, size: small, font: helv }) - form.createTextField('sepa_bank').addToPage(page2, { x: inputX, y: syFields - fieldHeight2 + 2 + inputYAdjust - page2DownShift, width: Math.round(fieldWidth2 * fieldShrinkFactor), height: fieldHeight2, font: helv }) + createUnderlinedTextField('sepa_bank', page2, { x: inputX, y: syFields - fieldHeight2 + 2 + inputYAdjust - page2DownShift, width: Math.round(fieldWidth2 * fieldShrinkFactor), height: fieldHeight2, font: helv }) syFields -= lineGap * 1.1 page2.drawText('IBAN:', { x: sepaLeft + labelOffset, y: syFields, size: small, font: helv }) - form.createTextField('sepa_iban').addToPage(page2, { x: inputX, y: syFields - fieldHeight2 + 2 + inputYAdjust - page2DownShift, width: Math.round(fieldWidth2 * fieldShrinkFactor), height: fieldHeight2, font: helv }) + createUnderlinedTextField('sepa_iban', page2, { x: inputX, y: syFields - fieldHeight2 + 2 + inputYAdjust - page2DownShift, width: Math.round(fieldWidth2 * fieldShrinkFactor), height: fieldHeight2, font: helv }) syFields -= lineGap * 1.1 page2.drawText('BIC:', { x: sepaLeft + labelOffset, y: syFields, size: small, font: helv }) // BIC remains full width as requested - form.createTextField('sepa_bic').addToPage(page2, { x: inputX, y: syFields - fieldHeight2 + 2 + inputYAdjust - page2DownShift, width: 220, height: fieldHeight2, font: helv }) + createUnderlinedTextField('sepa_bic', page2, { x: inputX, y: syFields - fieldHeight2 + 2 + inputYAdjust - page2DownShift, width: 220, height: fieldHeight2, font: helv }) syFields -= lineGap * 1.1 // add signature and date lines 2cm below last field @@ -311,7 +344,7 @@ async function create() { const sepaDateFieldX = sigDateStartX + sigDateWidth / 2 - sepaDateFieldWidth / 2 // position sepa date field so its bottom edge is on the signature line // raise SEPA date field by the same amount so its top/bottom alignment matches requested position - form.createTextField('sepa_datum').addToPage(page2, { x: sepaDateFieldX, y: signY2 - 2 - fieldHeight2 + dateRaise, width: sepaDateFieldWidth, height: fieldHeight2, font: helv }) + createUnderlinedTextField('sepa_datum', page2, { x: sepaDateFieldX, y: signY2 - 2 - fieldHeight2 + dateRaise, width: sepaDateFieldWidth, height: fieldHeight2, font: helv, drawUnderline: false }) // footer on page 2: right-aligned 'Seite 2 von 3' 2cm from bottom const footerText2 = 'Seite 2 von 3' @@ -473,21 +506,21 @@ Das Vereinsmitglied trifft die Entscheidung zur Veröffentlichung seiner Daten i // downward nudge for non-date inputs requested now: 0.2 cm -> ~5.67 pt const nonDateDownShift = 0.2 * 28.35 // 0.2 cm -> ~5.67 pt page3.drawText('Name:', { x: formLeft, y: py, size: normalSize, font: helv }) - form.createTextField('page3_name').addToPage(page3, { x: formLeft + 70 + leftInputShift + extraHShift, y: py - formFieldH + verticalFieldShift - nonDateDownShift, width: 160, height: formFieldH, font: helv }) + createUnderlinedTextField('page3_name', page3, { x: formLeft + 70 + leftInputShift + extraHShift, y: py - formFieldH + verticalFieldShift - nonDateDownShift, width: 160, height: formFieldH, font: helv }) // Vorname label and field moved further right as requested page3.drawText('Vorname:', { x: rightColX + vornameLabelShift, y: py, size: normalSize, font: helv }) - form.createTextField('page3_vorname').addToPage(page3, { x: rightColX + 70 + vornameFieldShift + extraHShift, y: py - formFieldH + verticalFieldShift - nonDateDownShift, width: 160, height: formFieldH, font: helv }) + createUnderlinedTextField('page3_vorname', page3, { x: rightColX + 70 + vornameFieldShift + extraHShift, y: py - formFieldH + verticalFieldShift - nonDateDownShift, width: 160, height: formFieldH, font: helv }) py -= formGap // Anschrift (full width) page3.drawText('Anschrift:', { x: formLeft, y: py, size: normalSize, font: helv }) - form.createTextField('page3_anschrift').addToPage(page3, { x: formLeft + 70 + leftInputShift + extraHShift, y: py - formFieldH + verticalFieldShift - nonDateDownShift, width: formFieldW + 40, height: formFieldH, font: helv }) + createUnderlinedTextField('page3_anschrift', page3, { x: formLeft + 70 + leftInputShift + extraHShift, y: py - formFieldH + verticalFieldShift - nonDateDownShift, width: formFieldW + 40, height: formFieldH, font: helv }) py -= formGap // Row 3: Telefonnummer (left) and E-Mail (right) // Keep left label at formLeft, shift only the input field by leftInputShift page3.drawText('Telefonnummer:', { x: formLeft, y: py, size: normalSize, font: helv }) - form.createTextField('page3_telefon').addToPage(page3, { x: formLeft + 70 + leftInputShift + extraHShift, y: py - formFieldH + verticalFieldShift - nonDateDownShift, width: 160, height: formFieldH, font: helv }) + createUnderlinedTextField('page3_telefon', page3, { x: formLeft + 70 + leftInputShift + extraHShift, y: py - formFieldH + verticalFieldShift - nonDateDownShift, width: 160, height: formFieldH, font: helv }) page3.drawText('E-Mail-Adresse:', { x: rightColX + vornameLabelShift, y: py, size: normalSize, font: helv }) - form.createTextField('page3_email').addToPage(page3, { x: rightColX + 70 + vornameFieldShift + extraHShift, y: py - formFieldH + verticalFieldShift - nonDateDownShift, width: 180, height: formFieldH, font: helv }) + createUnderlinedTextField('page3_email', page3, { x: rightColX + 70 + vornameFieldShift + extraHShift, y: py - formFieldH + verticalFieldShift - nonDateDownShift, width: 180, height: formFieldH, font: helv }) py -= formGap // remove fax field/label per request (space preserved) py -= formGap @@ -499,7 +532,7 @@ Das Vereinsmitglied trifft die Entscheidung zur Veröffentlichung seiner Daten i // date field also moves up by verticalFieldShift (but not horizontally shifted by extraHShift) // now move the date and signature line 0.2cm down as requested const dateFieldY = py - formFieldH + verticalFieldShift - nonDateDownShift - form.createTextField('page3_datum').addToPage(page3, { x: dateX, y: dateFieldY, width: dateFieldW, height: formFieldH, font: helv }) + createUnderlinedTextField('page3_datum', page3, { x: dateX, y: dateFieldY, width: dateFieldW, height: formFieldH, font: helv, drawUnderline: false }) // signature line starts directly under the (moved) date field page3.drawRectangle({ x: dateX, y: dateFieldY - 6, width: 300, height: 1, color: rgb(0,0,0) }) // label under signature line @@ -515,8 +548,12 @@ Das Vereinsmitglied trifft die Entscheidung zur Veröffentlichung seiner Daten i } const pdfBytes = await pdfDoc.save() + fs.mkdirSync('server/templates', { recursive: true }) + fs.mkdirSync('public/documents', { recursive: true }) fs.writeFileSync('server/templates/mitgliedschaft-fillable.pdf', pdfBytes) + fs.writeFileSync('public/documents/beitrittserklärung_template.pdf', pdfBytes) console.log('Wrote server/templates/mitgliedschaft-fillable.pdf') + console.log('Wrote public/documents/beitrittserklärung_template.pdf') } diff --git a/server/templates/mitgliedschaft-fillable.pdf b/server/templates/mitgliedschaft-fillable.pdf index f6ff8149b95024b7fb4b1cc141715808a60e96ae..c4f121619f162bd54bbf885d037b9fa24fe5a229 100644 GIT binary patch literal 17387 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 QSO^Tx%L8Cyl2VrbFBfUQCjbBd literal 17581 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 G%O{AXKk-f=tBJfRcX$-Q zS>9{xf0*JhQ#