11import JSZip from "jszip" ;
22import contentDisposition from "content-disposition" ;
3+ import PDFDocument from "pdfkit" ;
4+ import SVGtoPDF from "svg-to-pdfkit" ;
35import {
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+
1635const 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