Pdfs Desde Node Full -mega- — Nestjs Reportes Genera
FROM ghcr.io/puppeteer/puppeteer:20.0.0 WORKDIR /app COPY package*.json ./ RUN npm ci COPY . .
async generateWithTimeout(data: any, timeoutMs = 30000) return Promise.race([ this.generateReport(data), new Promise((_, reject) => setTimeout(() => reject(new Error('PDF generation timeout')), timeoutMs) ), ]); NestJs Reportes Genera PDFs desde Node Full -Mega-
return this.instances.pop()!;
(in main.ts or before use):
async onModuleInit() // Launch browser once (reuse across requests) this.browser = await puppeteer.launch( headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox'], ); FROM ghcr
// pdf.module.ts import Module from '@nestjs/common'; import PdfService from './pdf.service'; import PdfController from './pdf.controller'; @Module( providers: [PdfService], controllers: [PdfController], exports: [PdfService], ) export class PdfModule {} // pdf.service.ts import Injectable, Logger from '@nestjs/common'; import * as puppeteer from 'puppeteer'; import * as handlebars from 'handlebars'; import * as fs from 'fs/promises'; import join from 'path'; @Injectable() export class PdfService private readonly logger = new Logger(PdfService.name); private browser: puppeteer.Browser; Load HTML template const templatePath = join(process
async generateReport(templateName: string, data: any): Promise<Buffer> try // 1. Load HTML template const templatePath = join(process.cwd(), 'templates', $templateName.hbs ); const htmlTemplate = await fs.readFile(templatePath, 'utf-8');