UNPKG

@maistik/nuxt-pdf

Version:

A Nuxt 3 & 4 module for server-side PDF generation using Handlebars templates

58 lines (57 loc) 2.03 kB
import { defineEventHandler, readBody, setHeader, createError, isError } from "h3"; import { useRuntimeConfig } from "#imports"; import { customHelpers } from "#pdf-custom-helpers"; import { compilePdfComponent } from "../../utils/compiler.js"; import { createPdfProvider } from "../../utils/providers.js"; export default defineEventHandler(async (event) => { const config = useRuntimeConfig(); const body = await readBody(event); const template = body?.template; const ctx = body?.ctx; if (typeof template !== "string" || template.length === 0) { throw createError({ statusCode: 400, statusMessage: 'Missing or invalid "template"' }); } if (!ctx || typeof ctx !== "object") { throw createError({ statusCode: 400, statusMessage: 'Missing or invalid "ctx"' }); } const templateSources = config.pdf.templateSources; if (!Object.prototype.hasOwnProperty.call(templateSources, template)) { throw createError({ statusCode: 404, statusMessage: `Template "${template}" not found` }); } const { data, options = {}, locale } = ctx; const mergedOptions = { ...config.pdf.defaultOptions, ...options }; const messages = config.pdf.enableI18n ? config.pdf.i18nMessages[locale || config.pdf.defaultLocale] || {} : {}; try { const html = compilePdfComponent( template, { data, options: mergedOptions, locale }, messages, templateSources, config.pdf.partialSources, customHelpers ); const provider = createPdfProvider(config.pdf.provider, config.pdf.providers); const pdfBuffer = await provider.generatePdf(html, mergedOptions); setHeader(event, "Content-Type", "application/pdf"); setHeader(event, "Content-Length", pdfBuffer.length.toString()); return pdfBuffer; } catch (error) { console.error("PDF generation error:", error); if (isError(error)) { throw error; } throw createError({ statusCode: 500, statusMessage: "Failed to generate PDF" }); } });