qus-node-pdf-generator-temp
Version:
client api for generating pdfs in nestjs
56 lines (45 loc) • 1.77 kB
text/typescript
import { Injectable } from '@nestjs/common';
import * as Handlebars from 'handlebars';
import puppeteer, { Browser, Page } from 'puppeteer';
()
export class PdfService {
/**
* Renders a single template into a PDF.
*
* @param template
* @param data
*/
async render(template: string, data: any): Promise<Uint8Array> {
// Compile the Handlebars template
const compiledTemplate: HandlebarsTemplateDelegate = Handlebars.compile(template);
const htmlContent: string = compiledTemplate(data);
// Generate PDF using Puppeteer
const browser: Browser = await puppeteer.launch({ headless: 'shell' });
const page: Page = await browser.newPage();
await page.setContent(htmlContent, { waitUntil: 'networkidle0' });
const pdfBuffer: Uint8Array = await page.pdf({ format: 'A4' });
await browser.close();
return pdfBuffer;
}
/**
* Renders multiple templates into a single PDF.
*
* @param templates
* @param data
*/
async renderMultiple(templates: string[], data: any[]): Promise<Uint8Array> {
// Combine all HTML content
let combinedHtmlContent = '';
for (let i: number = 0; i < templates.length; i++) {
const compiledTemplate: HandlebarsTemplateDelegate = Handlebars.compile(templates[i]);
combinedHtmlContent += compiledTemplate(data[i]);
}
// Generate PDF using Puppeteer
const browser: Browser = await puppeteer.launch({ headless: 'shell' });
const page: Page = await browser.newPage();
await page.setContent(combinedHtmlContent, { waitUntil: 'networkidle0' });
const pdfBuffer: Uint8Array = await page.pdf({ format: 'A4' });
await browser.close();
return pdfBuffer;
}
}