Nestjs Reportes Genera Pdfs Desde Node Full -mega- -
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, );
async onModuleInit() // Launch browser once (reuse across requests) this.browser = await puppeteer.launch( headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox'], );
Now go generate those reports! 📄🚀
| Library | Use Case | Install | |---------|----------|---------| | puppeteer | Complex HTML/CSS/JS rendering (Chrome) | npm install puppeteer | | @react-pdf/renderer | React-style declarative PDFs | npm install @react-pdf/renderer | | pdfmake | Simple tables & text | npm install pdfmake | | wkhtmltopdf | Legacy HTML→PDF | (Requires OS binary) |
res.setHeader('Content-Type', 'application/pdf'); res.setHeader('Content-Disposition', 'attachment; filename=large-report.pdf'); NestJs Reportes Genera PDFs desde Node Full -Mega-
✅ Reuse browser instance across requests ✅ Stream large PDFs instead of buffering ✅ Set proper timeouts for slow renders ✅ Use Docker with pre-installed Chrome
// Option 1: Download as file @Post('invoice') async generateInvoice(@Body() data: any, @Res() res: Response) const pdfBuffer = await this.pdfService.generateReport('invoice', data); async streamLargeReport(res: Response
// 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;
