From 4653430c0f26cc70b35221c8e395e68928616092 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sat, 13 Dec 2025 21:02:14 +0000 Subject: [PATCH] Added infinite height support. --- src/templates/assets/basetemplate.ejs | 12 ++++++------ src/templates/assets/rendertemplate.ejs | 2 +- src/templates/pdffactory.js | 15 ++++++++++++--- src/templates/templatemanager.js | 24 +++++++++++++++++++----- 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/templates/assets/basetemplate.ejs b/src/templates/assets/basetemplate.ejs index 9465a5e..b236782 100644 --- a/src/templates/assets/basetemplate.ejs +++ b/src/templates/assets/basetemplate.ejs @@ -18,18 +18,18 @@ } .previewWrapper { - width: <%= (width * scale) + 'mm' || '50mm' %>; - height: <%= (height * scale) + 'mm' || '50mm' %>; + width: <%= (scaledWidth) || '50mm' %>; + height: <%= (scaledHeight) || '50mm' %>; } .previewDocument { - width: <%= (width) + 'mm' || '50mm' %>; - height: <%= (height) + 'mm' || '50mm' %>; + width: <%= (width) || '50mm' %>; + height: <%= (height) || '50mm' %>; transform: scale(<%= scale || '1' %>); transform-origin: top left; } .renderDocument { - width: <%= (width * scale) + 'mm' || '50mm' %>; - height: <%= (height * scale) + 'mm' || '50mm' %>; + width: <%= (scaledWidth) || '50mm' %>; + height: <%= (scaledHeight) || '50mm' %>; transform: scale(<%= scale || '1' %>); } diff --git a/src/templates/assets/rendertemplate.ejs b/src/templates/assets/rendertemplate.ejs index 8921d1f..9415dae 100644 --- a/src/templates/assets/rendertemplate.ejs +++ b/src/templates/assets/rendertemplate.ejs @@ -1 +1 @@ -
<%- content %>
+
<%- content %>
diff --git a/src/templates/pdffactory.js b/src/templates/pdffactory.js index 4792941..944feb3 100644 --- a/src/templates/pdffactory.js +++ b/src/templates/pdffactory.js @@ -30,13 +30,22 @@ export async function generatePDF(html, options = {}) { waitUntil: 'networkidle0' }); + var height = `${options?.height || '50'}mm`; + + if (options.height == 'auto') { + console.log('Calculating height'); + const calculatedHeight = await page.evaluate(() => { + return document.getElementById('content').scrollHeight; + }); + + height = `${calculatedHeight}px`; + } // Generate PDF with specified dimensions const pdfBuffer = await page.pdf({ - format: options.format || undefined, - width: options.width ? `${options.width}mm` : undefined, - height: options.height ? `${options.height}mm` : undefined, printBackground: true, preferCSSPageSize: true, + width: options.width ? `${options.width}mm` : undefined, + height: height ? `${height}` : undefined, margin: { top: '0mm', right: '0mm', diff --git a/src/templates/templatemanager.js b/src/templates/templatemanager.js index b17514e..898d6d3 100644 --- a/src/templates/templatemanager.js +++ b/src/templates/templatemanager.js @@ -430,8 +430,14 @@ export class TemplateManager { documentTemplate.parent.content == null || typeof documentTemplate.parent.content !== 'string' ) { + console.log( + 'Parent template content is required and must be a string.', + documentTemplate.parent.content + ); return { - error: 'Parent template content is required and must be a string.' + error: + 'Parent template content is required and must be a string.' + + documentTemplate.parent.content }; } templateWithParentContent = await ejs.render( @@ -481,12 +487,18 @@ export class TemplateManager { return { error: 'Failed to render inner template content.' }; } + const infiniteHeight = documentSize.infiniteHeight == true; + const baseHtml = await ejs.render( baseTemplate, { content: innerHtml, - width: documentSize.width, - height: documentSize.height, + width: `${documentSize.width}mm`, + height: infiniteHeight ? 'fit-content' : `${documentSize.height}mm`, + scaledWidth: `${documentSize.width * scale}mm`, + scaledHeight: infiniteHeight + ? 'auto' + : `${documentSize.height * scale}mm`, scale: `${scale}`, baseCSS: baseCSS, previewPaginationScript: preview ? previewPaginationScript : '' @@ -497,7 +509,8 @@ export class TemplateManager { const previewObject = { html: baseHtml, width: documentSize.width, - height: documentSize.height + height: infiniteHeight ? 'auto' : documentSize.height, + infiniteHeight: infiniteHeight }; return previewObject; @@ -552,7 +565,8 @@ export class TemplateManager { // Generate PDF using PDF factory const pdfBuffer = await generatePDF(baseHtml, { width: renderedTemplate.width, - height: renderedTemplate.height + height: renderedTemplate.height, + infiniteHeight: renderedTemplate.infiniteHeight }); const pdfObject = {