diff --git a/README.md b/README.md index f48f94a..f18010f 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,4 @@ A projekt célja, a Kard és Mágia második kiadásához kitölthető PDF karak 1. `yarn install` 2. `tsc -w` -3. `node dist/index.js` +3. `node --watch dist/index.js` diff --git a/helpers.ts b/helpers.ts new file mode 100644 index 0000000..d9c7310 --- /dev/null +++ b/helpers.ts @@ -0,0 +1,29 @@ +import {PDFFont, PDFForm, PDFPage, PDFTextField, rgb} from "pdf-lib"; + +export interface TextFieldOptions { + name: string, + x: number, + y: number, + w: number, + h: number, + text?: string, +} + +export type RenderTextBoxFunc = (options: TextFieldOptions) => PDFTextField; + +export function addTextFieldFactory(form: PDFForm, pdfFont: PDFFont, page: PDFPage): RenderTextBoxFunc { + return (options: TextFieldOptions) => { + const field = form.createTextField(options.name) + field.setText(options.text) + field.addToPage(page, { + x: options.x, + y: options.y, + font: pdfFont, + borderColor: rgb(1, 1, 1), + borderWidth: 0, + width: options.w, + height: options.h, + }) + return field + } +} \ No newline at end of file diff --git a/karlap.pdf b/karlap.pdf index 6dffda1..4dd69a0 100644 Binary files a/karlap.pdf and b/karlap.pdf differ diff --git a/karlap.ts b/karlap.ts index 081606c..ba7af91 100644 --- a/karlap.ts +++ b/karlap.ts @@ -1,7 +1,9 @@ -import {PDFDocument, PDFPage, rgb} from "pdf-lib"; +import {PDFDocument} from "pdf-lib"; import fs from "fs/promises"; import fontKit from "@pdf-lib/fontkit" - +import {addTextFieldFactory} from "./helpers"; +import {renderMainPage} from "./renderMainPage"; +import {renderSecondPage} from "./renderSecondPage"; export async function Karlap() { const docBuffer = await fs.readFile("kemkas2karakterlap.pdf", {encoding: null, flag: 'r'}) @@ -13,538 +15,13 @@ export async function Karlap() { const page0 = doc.getPage(0) page0.setFont(pdfFont) + const addTextField0 = addTextFieldFactory(form, pdfFont, page0) + renderMainPage(addTextField0); - const addTextFieldToPage = (page: PDFPage) => (options: {name: string, x: number, y: number, w: number, h: number, text?: string}) => { - const field = form.createTextField(options.name) - field.setText(options.text) - field.addToPage(page, { - x: options.x, - y: options.y, - font: pdfFont, - borderColor: rgb(1,1,1), - borderWidth: 0, - width: options.w, - height: options.h, - }) - return field - } - - const addTextField0 = addTextFieldToPage(page0) - - addTextField0({ - name: "nev_faj_osztaly", - x: 55, - y: 730, - w: 420, - h: 24 - }) - addTextField0({ - name: "szint", - x: 495, - y: 711, - w: 36, - h: 36 - }) - - addTextField0({ - name: "vo", - x: 210, - y: 690, - w: 28, - h: 28 - }) - addTextField0({ - name: "pancel", - x: 303, - y: 705, - w: 24, - h: 16 - }) - addTextField0({ - name: "pajzs", - x: 369, - y: 705, - w: 24, - h: 16 - }) - addTextField0({ - name: "egyeb_vo", - x: 436, - y: 705, - w: 24, - h: 16 - }) - - // Tulajdonsagok - addTextField0({ - name: "tul_ero", - x: 130, - y: 688, - w: 24, - h: 16 - }) - addTextField0({ - name: "tul_ero_mod", - x: 169, - y: 688, - w: 14, - h: 16 - }) - addTextField0({ - name: "tul_ugy", - x: 130, - y: 660, - w: 24, - h: 16 - }) - addTextField0({ - name: "tul_ugy_mod", - x: 169, - y: 660, - w: 14, - h: 16 - }) - addTextField0({ - name: "tul_egs", - x: 130, - y: 631, - w: 24, - h: 16 - }) - addTextField0({ - name: "tul_egs_mod", - x: 169, - y: 631, - w: 14, - h: 16 - }) - addTextField0({ - name: "tul_int", - x: 130, - y: 603, - w: 24, - h: 16 - }) - addTextField0({ - name: "tul_int_mod", - x: 169, - y: 603, - w: 14, - h: 16 - }) - addTextField0({ - name: "tul_bol", - x: 130, - y: 575, - w: 24, - h: 16 - }) - addTextField0({ - name: "tul_bol_mod", - x: 169, - y: 575, - w: 14, - h: 16 - }) - addTextField0({ - name: "tul_kar", - x: 130, - y: 546, - w: 24, - h: 16 - }) - addTextField0({ - name: "tul_kar_mod", - x: 169, - y: 546, - w: 14, - h: 16 - }) - - addTextField0({ - name: "jellem", - x: 385, - y: 680, - w: 113, - h: 16 - }) - addTextField0({ - name: "istenseg", - x: 385, - y: 651, - w: 150, - h: 16 - }) - - // HP - addTextField0({ - name: "hp_rolls", - x: 199, - y: 640, - w: 175, - h: 16 - }) - addTextField0({ - name: "hp_aktualis", - x: 202, - y: 600, - w: 170, - h: 16 - }) - addTextField0({ - name: "hp_aktualis_2", - x: 202, - y: 584, - w: 170, - h: 16 - }) - addTextField0({ - name: "hp_aktualis_3", - x: 202, - y: 568, - w: 170, - h: 16 - }) - addTextField0({ - name: "hp_aktualis_4", - x: 202, - y: 554, - w: 170, - h: 14 - }) - - // Mentők - addTextField0({ - name: "kitartas_alap", - x: 445, - y: 617, - w: 24, - h: 16 - }) - addTextField0({ - name: "kitartas_mod", - x: 479, - y: 617, - w: 24, - h: 16 - }) - addTextField0({ - name: "kitartas_sum", - x: 518, - y: 618, - w: 14, - h: 14 - }) - addTextField0({ - name: "reflex_alap", - x: 445, - y: 589, - w: 24, - h: 16 - }) - addTextField0({ - name: "reflex_mod", - x: 479, - y: 589, - w: 24, - h: 16 - }) - addTextField0({ - name: "reflex_sum", - x: 518, - y: 590, - w: 14, - h: 14 - }) - addTextField0({ - name: "akaratero_alap", - x: 445, - y: 560, - w: 24, - h: 16 - }) - addTextField0({ - name: "akaratero_mod", - x: 479, - y: 560, - w: 24, - h: 16 - }) - addTextField0({ - name: "akaratero_sum", - x: 518, - y: 561, - w: 14, - h: 14 - }) - - addTextField0({ - name: "kezdemenyezes", - x: 518, - y: 536, - w: 14, - h: 14 - }) - - addTextField0({ - name: "tamadas_bonusz_alap", - x: 141, - y: 503, - w: 38, - h: 16 - }) - addTextField0({ - name: "tamadas_bonusz_ero", - x: 110, - y: 475, - w: 24, - h: 16 - }) - addTextField0({ - name: "tamadas_bonusz_kozelharc", - x: 145, - y: 476, - w: 31, - h: 14 - }) - addTextField0({ - name: "tamadas_bonusz_ugy", - x: 110, - y: 447, - w: 24, - h: 16 - }) - addTextField0({ - name: "tamadas_bonusz_tavolsagi", - x: 145, - y: 448, - w: 31, - h: 14 - }) - - addTextField0({ - name: "fegyver_1", - x: 187, - y: 503, - w: 248, - h: 16 - }) - addTextField0({ - name: "fegyver_2", - x: 187, - y: 475, - w: 248, - h: 16 - }) - addTextField0({ - name: "fegyver_3", - x: 187, - y: 447, - w: 248, - h: 16 - }) - addTextField0({ - name: "fegyver_4", - x: 187, - y: 419, - w: 248, - h: 16 - }) - - addTextField0({ - name: "tapasztalat", - x: 442, - y: 500, - w: 95, - h: 16 - }) - addTextField0({ - name: "tapasztalat_2", - x: 442, - y: 484, - w: 95, - h: 16 - }) - addTextField0({ - name: "tapasztalat_3", - x: 442, - y: 468, - w: 95, - h: 16 - }) - addTextField0({ - name: "tapasztalat_4", - x: 442, - y: 452, - w: 95, - h: 16 - }) - addTextField0({ - name: "tapasztalat_kovetkezo_szint", - x: 447, - y: 418, - w: 85, - h: 16 - }) - - // kepzettseg elso oszlop - for (let i = 0; i < 6; i++) { - addTextField0({ - name: `kepzettseg_${i}_nev`, - x: 57, - y: 390 - (i * 28.25), - w: 100, - h: 16 - }) - addTextField0({ - name: `kepzettseg_${i}_alap`, - x: 161, - y: 390 - (i * 28.25), - w: 24, - h: 16 - }) - addTextField0({ - name: `kepzettseg_${i}_bonusz`, - x: 195, - y: 390 - (i * 28.25), - w: 24, - h: 16 - }) - addTextField0({ - name: `kepzettseg_${i}_osszes`, - x: 234, - y: 391 - (i * 28.25), - w: 14, - h: 14 - }) - } - // kepzettseg masodik oszlop - for (let i = 0; i < 6; i++) { - addTextField0({ - name: `kepzettseg_${(i + 6)}_nev`, - x: 57+213, - y: 390 - (i * 28.25), - w: 100, - h: 16 - }) - addTextField0({ - name: `kepzettseg_${(i + 6)}_alap`, - x: 161+213, - y: 390 - (i * 28.25), - w: 24, - h: 16 - }) - addTextField0({ - name: `kepzettseg_${(i + 6)}_bonusz`, - x: 195+213, - y: 390 - (i * 28.25), - w: 24, - h: 16 - }) - addTextField0({ - name: `kepzettseg_${(i + 6)}_osszes`, - x: 234+213, - y: 391 - (i * 28.25), - w: 14, - h: 14 - }) - } - - addTextField0({ - name: `arany`, - x: 475, - y: 387, - w: 63, - h: 14 - }) - addTextField0({ - name: `arany_2`, - x: 475, - y: 373, - w: 63, - h: 14 - }) - addTextField0({ - name: `arany_3`, - x: 475, - y: 361, - w: 63, - h: 12 - }) - addTextField0({ - name: `elektrum`, - x: 475, - y: 387-56, - w: 63, - h: 14 - }) - addTextField0({ - name: `elektrum_2`, - x: 475, - y: 373-56, - w: 63, - h: 14 - }) - addTextField0({ - name: `elektrum_3`, - x: 475, - y: 361-56, - w: 63, - h: 12 - }) - addTextField0({ - name: `ezust`, - x: 475, - y: 387-56-57, - w: 63, - h: 14 - }) - addTextField0({ - name: `ezust_2`, - x: 475, - y: 373-56-57, - w: 63, - h: 14 - }) - addTextField0({ - name: `ezust_3`, - x: 475, - y: 361-56-57, - w: 63, - h: 12 - }) - - // viselt - for (let i = 0; i < 8; i++) { - addTextField0({ - name: `viselt_${(i)}`, - x: 62, - y: 197 - (i * 19.75), - w: 143, - h: 16 - }) - } - // cipelt - for (let i = 0; i < 8; i++) { - addTextField0({ - name: `cipelt_${(i)}`, - x: 227, - y: 197 - (i * 19.75), - w: 143, - h: 16 - }) - } - // aprosagok - for (let i = 0; i < 8; i++) { - addTextField0({ - name: `aprosagok_${(i)}`, - x: 391, - y: 197 - (i * 19.75), - w: 143, - h: 16 - }) - } - + const page1 = doc.getPage(1) + page1.setFont(pdfFont) + const addTextField1 = addTextFieldFactory(form, pdfFont, page1) + renderSecondPage(addTextField1); form.updateFieldAppearances(pdfFont) const pdfBytes = await doc.save() diff --git a/renderMainPage.ts b/renderMainPage.ts new file mode 100644 index 0000000..70f5588 --- /dev/null +++ b/renderMainPage.ts @@ -0,0 +1,550 @@ +import {PDFTextField} from "pdf-lib"; +import {TextFieldOptions} from "./helpers"; + +function renderTulajdonsagok(addTextField: (options: TextFieldOptions) => PDFTextField) { + // Tulajdonsagok + addTextField({ + name: "tul_ero", + x: 130, + y: 688, + w: 24, + h: 16 + }) + addTextField({ + name: "tul_ero_mod", + x: 169, + y: 688, + w: 14, + h: 16 + }) + addTextField({ + name: "tul_ugy", + x: 130, + y: 660, + w: 24, + h: 16 + }) + addTextField({ + name: "tul_ugy_mod", + x: 169, + y: 660, + w: 14, + h: 16 + }) + addTextField({ + name: "tul_egs", + x: 130, + y: 631, + w: 24, + h: 16 + }) + addTextField({ + name: "tul_egs_mod", + x: 169, + y: 631, + w: 14, + h: 16 + }) + addTextField({ + name: "tul_int", + x: 130, + y: 603, + w: 24, + h: 16 + }) + addTextField({ + name: "tul_int_mod", + x: 169, + y: 603, + w: 14, + h: 16 + }) + addTextField({ + name: "tul_bol", + x: 130, + y: 575, + w: 24, + h: 16 + }) + addTextField({ + name: "tul_bol_mod", + x: 169, + y: 575, + w: 14, + h: 16 + }) + addTextField({ + name: "tul_kar", + x: 130, + y: 546, + w: 24, + h: 16 + }) + addTextField({ + name: "tul_kar_mod", + x: 169, + y: 546, + w: 14, + h: 16 + }) +} + +function renderVO(addTextField: (options: TextFieldOptions) => PDFTextField) { + addTextField({ + name: "vo", + x: 210, + y: 690, + w: 28, + h: 28 + }) + addTextField({ + name: "pancel", + x: 303, + y: 705, + w: 24, + h: 16 + }) + addTextField({ + name: "pajzs", + x: 369, + y: 705, + w: 24, + h: 16 + }) + addTextField({ + name: "egyeb_vo", + x: 436, + y: 705, + w: 24, + h: 16 + }) +} + +function renderBaseInfo(addTextField: (options: TextFieldOptions) => PDFTextField) { + addTextField({ + name: "nev_faj_osztaly", + x: 55, + y: 730, + w: 420, + h: 24 + }) + addTextField({ + name: "szint", + x: 495, + y: 711, + w: 36, + h: 36 + }) + addTextField({ + name: "jellem", + x: 385, + y: 680, + w: 113, + h: 16 + }) + addTextField({ + name: "istenseg", + x: 385, + y: 651, + w: 150, + h: 16 + }) +} + +function renderHP(addTextField: (options: TextFieldOptions) => PDFTextField) { + addTextField({ + name: "hp_rolls", + x: 199, + y: 640, + w: 175, + h: 16 + }) + addTextField({ + name: "hp_aktualis", + x: 202, + y: 600, + w: 170, + h: 16 + }) + addTextField({ + name: "hp_aktualis_2", + x: 202, + y: 584, + w: 170, + h: 16 + }) + addTextField({ + name: "hp_aktualis_3", + x: 202, + y: 568, + w: 170, + h: 16 + }) + addTextField({ + name: "hp_aktualis_4", + x: 202, + y: 554, + w: 170, + h: 14 + }) +} + +function renderMentok(addTextField: (options: TextFieldOptions) => PDFTextField) { + addTextField({ + name: "kitartas_alap", + x: 445, + y: 617, + w: 24, + h: 16 + }) + addTextField({ + name: "kitartas_mod", + x: 479, + y: 617, + w: 24, + h: 16 + }) + addTextField({ + name: "kitartas_sum", + x: 518, + y: 618, + w: 14, + h: 14 + }) + addTextField({ + name: "reflex_alap", + x: 445, + y: 589, + w: 24, + h: 16 + }) + addTextField({ + name: "reflex_mod", + x: 479, + y: 589, + w: 24, + h: 16 + }) + addTextField({ + name: "reflex_sum", + x: 518, + y: 590, + w: 14, + h: 14 + }) + addTextField({ + name: "akaratero_alap", + x: 445, + y: 560, + w: 24, + h: 16 + }) + addTextField({ + name: "akaratero_mod", + x: 479, + y: 560, + w: 24, + h: 16 + }) + addTextField({ + name: "akaratero_sum", + x: 518, + y: 561, + w: 14, + h: 14 + }) +} + +function renderTamadasBonusz(addTextField: (options: TextFieldOptions) => PDFTextField) { + addTextField({ + name: "tamadas_bonusz_alap", + x: 141, + y: 503, + w: 38, + h: 16 + }) + addTextField({ + name: "tamadas_bonusz_ero", + x: 110, + y: 475, + w: 24, + h: 16 + }) + addTextField({ + name: "tamadas_bonusz_kozelharc", + x: 145, + y: 476, + w: 31, + h: 14 + }) + addTextField({ + name: "tamadas_bonusz_ugy", + x: 110, + y: 447, + w: 24, + h: 16 + }) + addTextField({ + name: "tamadas_bonusz_tavolsagi", + x: 145, + y: 448, + w: 31, + h: 14 + }) +} + +function renderFegyverek(addTextField: (options: TextFieldOptions) => PDFTextField) { + addTextField({ + name: "fegyver_1", + x: 187, + y: 503, + w: 248, + h: 16 + }) + addTextField({ + name: "fegyver_2", + x: 187, + y: 475, + w: 248, + h: 16 + }) + addTextField({ + name: "fegyver_3", + x: 187, + y: 447, + w: 248, + h: 16 + }) + addTextField({ + name: "fegyver_4", + x: 187, + y: 419, + w: 248, + h: 16 + }) +} + +function renderTapasztalat(addTextField: (options: TextFieldOptions) => PDFTextField) { + addTextField({ + name: "tapasztalat", + x: 442, + y: 500, + w: 95, + h: 16 + }) + addTextField({ + name: "tapasztalat_2", + x: 442, + y: 484, + w: 95, + h: 16 + }) + addTextField({ + name: "tapasztalat_3", + x: 442, + y: 468, + w: 95, + h: 16 + }) + addTextField({ + name: "tapasztalat_4", + x: 442, + y: 452, + w: 95, + h: 16 + }) + addTextField({ + name: "tapasztalat_kovetkezo_szint", + x: 447, + y: 418, + w: 85, + h: 16 + }) +} + +function renderKepzettsegek(addTextField: (options: TextFieldOptions) => PDFTextField) { + // elso oszlop + for (let i = 0; i < 6; i++) { + addTextField({ + name: `kepzettseg_${i}_nev`, + x: 57, + y: 390 - (i * 28.25), + w: 100, + h: 16 + }) + addTextField({ + name: `kepzettseg_${i}_alap`, + x: 161, + y: 390 - (i * 28.25), + w: 24, + h: 16 + }) + addTextField({ + name: `kepzettseg_${i}_bonusz`, + x: 195, + y: 390 - (i * 28.25), + w: 24, + h: 16 + }) + addTextField({ + name: `kepzettseg_${i}_osszes`, + x: 234, + y: 391 - (i * 28.25), + w: 14, + h: 14 + }) + } + // masodik oszlop + for (let i = 0; i < 6; i++) { + addTextField({ + name: `kepzettseg_${(i + 6)}_nev`, + x: 57 + 213, + y: 390 - (i * 28.25), + w: 100, + h: 16 + }) + addTextField({ + name: `kepzettseg_${(i + 6)}_alap`, + x: 161 + 213, + y: 390 - (i * 28.25), + w: 24, + h: 16 + }) + addTextField({ + name: `kepzettseg_${(i + 6)}_bonusz`, + x: 195 + 213, + y: 390 - (i * 28.25), + w: 24, + h: 16 + }) + addTextField({ + name: `kepzettseg_${(i + 6)}_osszes`, + x: 234 + 213, + y: 391 - (i * 28.25), + w: 14, + h: 14 + }) + } +} + +function renderPenz(addTextField: (options: TextFieldOptions) => PDFTextField) { + addTextField({ + name: `arany`, + x: 475, + y: 387, + w: 63, + h: 14 + }) + addTextField({ + name: `arany_2`, + x: 475, + y: 373, + w: 63, + h: 14 + }) + addTextField({ + name: `arany_3`, + x: 475, + y: 361, + w: 63, + h: 12 + }) + addTextField({ + name: `elektrum`, + x: 475, + y: 387 - 56, + w: 63, + h: 14 + }) + addTextField({ + name: `elektrum_2`, + x: 475, + y: 373 - 56, + w: 63, + h: 14 + }) + addTextField({ + name: `elektrum_3`, + x: 475, + y: 361 - 56, + w: 63, + h: 12 + }) + addTextField({ + name: `ezust`, + x: 475, + y: 387 - 56 - 57, + w: 63, + h: 14 + }) + addTextField({ + name: `ezust_2`, + x: 475, + y: 373 - 56 - 57, + w: 63, + h: 14 + }) + addTextField({ + name: `ezust_3`, + x: 475, + y: 361 - 56 - 57, + w: 63, + h: 12 + }) +} + +function renderFelszereles(addTextField: (options: TextFieldOptions) => PDFTextField) { + // viselt + for (let i = 0; i < 8; i++) { + addTextField({ + name: `viselt_${(i)}`, + x: 62, + y: 197 - (i * 19.75), + w: 143, + h: 16 + }) + } + // cipelt + for (let i = 0; i < 8; i++) { + addTextField({ + name: `cipelt_${(i)}`, + x: 227, + y: 197 - (i * 19.75), + w: 143, + h: 16 + }) + } + // aprosagok + for (let i = 0; i < 8; i++) { + addTextField({ + name: `aprosagok_${(i)}`, + x: 391, + y: 197 - (i * 19.75), + w: 143, + h: 16 + }) + } +} + +export function renderMainPage(addTextField: (options: TextFieldOptions) => PDFTextField) { + renderBaseInfo(addTextField); + renderVO(addTextField); + renderTulajdonsagok(addTextField); + renderHP(addTextField); + renderMentok(addTextField); + + addTextField({ + name: "kezdemenyezes", + x: 518, + y: 536, + w: 14, + h: 14 + }) + + renderTamadasBonusz(addTextField); + renderFegyverek(addTextField); + renderTapasztalat(addTextField); + renderKepzettsegek(addTextField); + renderPenz(addTextField); + renderFelszereles(addTextField); +} \ No newline at end of file diff --git a/renderSecondPage.ts b/renderSecondPage.ts new file mode 100644 index 0000000..fd91864 --- /dev/null +++ b/renderSecondPage.ts @@ -0,0 +1,5 @@ +import {RenderTextBoxFunc} from "./helpers"; + +export function renderSecondPage(addTextField: RenderTextBoxFunc): void { + +} \ No newline at end of file