@maistik/nuxt-pdf
Version:
A Nuxt 3 & 4 module for server-side PDF generation using Handlebars templates
58 lines (57 loc) • 2.03 kB
JavaScript
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"
});
}
});