import PuppeteerHTMLPDF from "puppeteer-html-pdf"; import { nanoid } from 'nanoid'; import fs from 'fs'; const pluginDefaults = { // Plugin defaults tempDir: "dist", // Directory where the temporary files are created debug: false, // Keep the generated temporary html file for debugging format: "A4", // Default pdf format margin: { // PDF file margins top: "1cm", right: "1.25cm", bottom: "1cm", left: "1.25cm", } }; export default function (eleventyConfig, options = {}) { const pluginConfig = Object.assign(pluginDefaults, options); eleventyConfig.addTransform("toPDF", async (content) => { if (this.outputPath && this.outputPath.toLowerCase().endsWith('.pdf')) { let tempFileName = pluginConfig.debug ? this.page.fileSlug : nanoid(); let htmlFile = `./${pluginConfig.tempDir}/${tempFileName}.html`; let pdfFile = `./${pluginConfig.tempDir}/${tempFileName}.pdf`; fs.writeFileSync(htmlFile, content); const htmlPDF = new PuppeteerHTMLPDF(); const pdfOptions = { format: pluginConfig.format, margin: pluginConfig.margin, path: pdfFile, }; htmlPDF.setOptions(pdfOptions); const pdfContent = await htmlPDF.readFile(htmlFile, "utf8"); await htmlPDF.create(pdfContent); let contents = fs.readFileSync(pdfFile, 'binary'); if (!pluginConfig.debug) { fs.unlinkSync(htmlFile); fs.unlinkSync(pdfFile); } return Buffer.from(contents,'binary'); } else return content; }); };