Nestjs Reportes Genera Pdfs Desde Node Full -mega- Apr 2026

FROM ghcr.io/puppeteer/puppeteer:20.0.0 WORKDIR /app COPY package*.json ./ RUN npm ci COPY . .

A. Browser Pooling (avoid cold starts) import Browser from 'puppeteer'; export class BrowserPool private static instances: Browser[] = []; private static max = 5;

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');

npm install @nestjs/core @nestjs/common puppeteer handlebars @types/puppeteer Create a dedicated module: NestJs Reportes Genera PDFs desde Node Full -Mega-

Now go generate those reports! 📄🚀

async generateWithTimeout(data: any, timeoutMs = 30000) return Promise.race([ this.generateReport(data), new Promise((_, reject) => setTimeout(() => reject(new Error('PDF generation timeout')), timeoutMs) ), ]);

const pdf = await page.pdf( format: 'A4', printBackground: true, margin: top: '20mm', bottom: '20mm', left: '15mm', right: '15mm' , ); FROM ghcr

handlebars.registerHelper('multiply', (a, b) => a * b); // pdf.controller.ts import Controller, Post, Body, Res, Get, Query from '@nestjs/common'; import Response from 'express'; import PdfService from './pdf.service'; @Controller('reports') export class PdfController { constructor(private readonly pdfService: PdfService) {}

async streamLargeReport(res: Response, data: any) const page = await this.browser.newPage(); await page.setContent(await this.renderHtml(data)); const stream = await page.createPDFStream( format: 'A4', printBackground: true, );

return this.instances.pop()!;

async onModuleDestroy() if (this.browser) await this.browser.close();

// Option 2: Inline preview @Post('preview') async previewReport(@Body() data: any, @Res() res: Response) const pdfBuffer = await this.pdfService.generateReport('dashboard', data); res.set( 'Content-Type': 'application/pdf' ); res.send(pdfBuffer); // Opens in browser