11// noinspection HtmlRequiredLangAttribute,HtmlRequiredTitleElement
22
33import { Logger } from '@nestjs/common' ;
4+ import axios from 'axios' ;
5+ import FormData from 'form-data' ;
46import fs from 'fs' ;
5- import puppeteer from 'puppeteer' ;
6- import { StaticSettings } from '../../settings/settings.static' ;
7+ import { StaticSettings } from 'module/settings/settings.static' ;
78
89/**
910 * @param T Type of the options passed to `generatePDF`.
@@ -29,52 +30,31 @@ export abstract class PDFGenerator<T = Record<string, unknown>> {
2930 */
3031 protected async generatePDFFromBodyContent ( body : string ) : Promise < Buffer > {
3132 const html = await this . putBodyInHTML ( body ) ;
32- let browser : puppeteer . Browser | undefined ;
33-
34- this . logger . debug ( 'Starting browser...' ) ;
35- this . logger . debug ( `\tExec path: ${ process . env . TMS_PUPPETEER_EXEC_PATH } ` ) ;
33+ const gotenbergConfig = StaticSettings . getService ( ) . getGotenbergConfiguration ( ) ;
3634
3735 try {
38- browser = await puppeteer . launch ( {
39- args : [ '--disable-dev-shm-usage' ] ,
40- executablePath : process . env . TMS_PUPPETEER_EXEC_PATH ,
41- timeout : StaticSettings . getService ( ) . getPuppeteerConfiguration ( ) ?. timeout ,
42- } ) ;
43-
44- this . logger . debug ( 'Browser started.' ) ;
45-
46- const page = await browser . newPage ( ) ;
47- this . logger . debug ( 'Page created.' ) ;
48-
49- await page . setContent ( html , { waitUntil : 'domcontentloaded' } ) ;
50- this . logger . debug ( 'Page content loaded' ) ;
51-
52- const buffer = await page . pdf ( {
53- format : 'A4' ,
54- margin : {
55- top : '1cm' ,
56- right : '1cm' ,
57- bottom : '1cm' ,
58- left : '1cm' ,
59- } ,
60- // Fixes CSS 'background' not being respected in printed PDFs.
61- printBackground : true ,
62- } ) ;
63-
64- this . logger . debug ( 'PDF created.' ) ;
65-
66- await browser . close ( ) ;
67-
68- this . logger . debug ( 'Browser closed' ) ;
69-
70- return buffer ;
36+ const form = new FormData ( ) ;
37+ form . append ( 'files' , html , { filename : 'index.html' , contentType : 'text/html' } ) ;
38+
39+ this . logger . debug ( 'Sending request to Gotenberg for PDF generation...' ) ;
40+
41+ const response = await axios . post (
42+ `http://${ gotenbergConfig ?. host } :${ gotenbergConfig ?. port } /forms/chromium/convert/html` ,
43+ form ,
44+ {
45+ headers : {
46+ ...form . getHeaders ( ) ,
47+ } ,
48+ timeout : gotenbergConfig ?. timeout ,
49+ responseType : 'arraybuffer' ,
50+ }
51+ ) ;
52+
53+ this . logger . debug ( 'PDF generated successfully from Gotenberg.' ) ;
54+
55+ return Buffer . from ( response . data ) ;
7156 } catch ( err ) {
72- if ( browser ) {
73- await browser . close ( ) ;
74- }
75-
76- Logger . error ( JSON . stringify ( err , null , 2 ) ) ;
77-
57+ this . logger . error ( 'Failed to generate PDF:' , err ) ;
7858 throw err ;
7959 }
8060 }
0 commit comments