Skip to content

Commit 2696512

Browse files
committed
added pdf export for qrs
1 parent 7fc6bb7 commit 2696512

4 files changed

Lines changed: 11897 additions & 7640 deletions

File tree

backend/app/routes/admin/qr-codes/[season]/export.ts

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import JSZip from "jszip";
22
import contentDisposition from "content-disposition";
3+
import PDFDocument from "pdfkit";
4+
import SVGtoPDF from "svg-to-pdfkit";
35
import {
46
AuthRouter,
57
} from "../../../../helpers/route";
@@ -13,6 +15,23 @@ import {
1315
QrCodeService,
1416
} from "../../../../services/qr-service";
1517

18+
const svgToPdfBuffer = (svg: string): Promise<Buffer> =>
19+
new Promise((resolve, reject) => {
20+
const doc = new PDFDocument({ size: "A4", margin: 20 });
21+
const chunks: Uint8Array[] = [];
22+
doc.on("data", (c: Buffer) => chunks.push(new Uint8Array(c)));
23+
doc.on("end", () => resolve(Buffer.concat(chunks)));
24+
doc.on("error", reject);
25+
26+
const pageWidth = doc.page.width - doc.page.margins.left - doc.page.margins.right;
27+
SVGtoPDF(doc, svg, doc.page.margins.left, doc.page.margins.top, {
28+
width: pageWidth,
29+
preserveAspectRatio: "xMidYMid meet",
30+
});
31+
doc.end();
32+
})
33+
;
34+
1635
const router = new AuthRouter({
1736
role: Role.Admin,
1837
});
@@ -49,11 +68,20 @@ const buildZip = async (season: string): Promise<{ buffer: Buffer; filename: str
4968
const seasonName = seasonRecord?.name ?? season;
5069
const zip = new JSZip();
5170

52-
const folders = {
53-
booth: zip.folder("booth")!,
54-
talk: zip.folder("talk")!,
55-
workshop: zip.folder("workshop")!,
56-
fusion: zip.folder("fusion")!,
71+
const svgRoot = zip.folder("svg")!;
72+
const pdfRoot = zip.folder("pdf")!;
73+
74+
const svgFolders = {
75+
booth: svgRoot.folder("booth")!,
76+
talk: svgRoot.folder("talk")!,
77+
workshop: svgRoot.folder("workshop")!,
78+
fusion: svgRoot.folder("fusion")!,
79+
};
80+
const pdfFolders = {
81+
booth: pdfRoot.folder("booth")!,
82+
talk: pdfRoot.folder("talk")!,
83+
workshop: pdfRoot.folder("workshop")!,
84+
fusion: pdfRoot.folder("fusion")!,
5785
};
5886

5987
for (const app of applications) {
@@ -86,7 +114,12 @@ const buildZip = async (season: string): Promise<{ buffer: Buffer; filename: str
86114
"color.logo": "#fff",
87115
text: company.brandName,
88116
});
89-
folders[type].file(`${ company.brandName } - ${ type } - ${ seasonName }.svg`, svg);
117+
118+
const baseName = `${ company.brandName } - ${ type } - ${ seasonName }`;
119+
svgFolders[type].file(`${ baseName }.svg`, svg);
120+
121+
const pdf = await svgToPdfBuffer(svg);
122+
pdfFolders[type].file(`${ baseName }.pdf`, new Uint8Array(pdf));
90123
}
91124
}
92125

0 commit comments

Comments
 (0)