Added pdf merging for big requests (over 100 runners)

ref #5
This commit is contained in:
Nicolai Ort 2021-02-07 16:04:56 +01:00
parent 4f191dcb52
commit 785544ca16
2 changed files with 32 additions and 2 deletions

View File

@ -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
}
}
}
}

View File

@ -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<Buffer>();
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<Buffer> {
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 <Buffer>(await mergedPdf.save());
}
/**
* Generates a new dummy runner with halfspaces for all strings.
* Can be used to generate empty sponsoring contracts.