diff --git a/package.json b/package.json index 814da18..d6dbe76 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "i18next": "^19.8.7", "i18next-fs-backend": "^1.0.8", "mime-types": "^2.1.28", + "pdf-lib": "^1.16.0", "puppeteer": "^7.0.1", "reflect-metadata": "^0.1.13", "routing-controllers": "^0.9.0-alpha.6", @@ -81,4 +82,4 @@ "publish": false } } -} \ No newline at end of file +} diff --git a/src/PdfCreator.ts b/src/PdfCreator.ts index 00e850d..f07255f 100644 --- a/src/PdfCreator.ts +++ b/src/PdfCreator.ts @@ -6,6 +6,7 @@ import i18next from "i18next"; import Backend from 'i18next-fs-backend'; import mime from "mime-types"; import path from 'path'; +import { PDFDocument } from 'pdf-lib'; import puppeteer from "puppeteer"; import { Runner } from './models/Runner'; import { RunnerGroup } from './models/RunnerGroup'; @@ -45,7 +46,7 @@ export class PdfCreator { return i18next.t(str, PdfCreator.interpolations).toString(); } ); - this.browser = await puppeteer.launch({ headless: true }); + this.browser = await puppeteer.launch({ headless: true, args: ['--disable-dev-shm-usage', '--shm-size=10gb'] }); } /** @@ -57,6 +58,15 @@ export class PdfCreator { if (runners.length == 1 && Object.keys(runners[0]).length == 0) { runners[0] = this.generateEmptyRunner(); } + if (runners.length > 100) { + let pdfs: Buffer[] = new Array(); + let i, j; + for (i = 0, j = runners.length; i < j; i += 100) { + let chunk = runners.slice(i, i + 100); + pdfs.push(await this.generateSponsoringContract(chunk, locale)); + } + return await this.mergePdfs(pdfs); + } await i18next.changeLanguage(locale); const template_source = fs.readFileSync(`${this.templateDir}/sponsoring_contract.html`, 'utf8'); const template = Handlebars.compile(template_source); @@ -112,6 +122,25 @@ export class PdfCreator { return pdf; } + /** + * Merges multiple pdfs into one. + * @param pdfs The pdfs you want to merge as an buffer array. + * @returns The merged pdf as a buffer. + */ + private async mergePdfs(pdfs: Buffer[]): Promise { + const mergedPdf = await PDFDocument.create(); + + for (const pdfBuffer of pdfs) { + const pdf = await PDFDocument.load(pdfBuffer); + const copiedPages = await mergedPdf.copyPages(pdf, pdf.getPageIndices()); + copiedPages.forEach((page) => { + mergedPdf.addPage(page); + }); + } + + return (await mergedPdf.save()); + } + /** * Generates a new dummy runner with halfspaces for all strings. * Can be used to generate empty sponsoring contracts.