diff --git a/static/src/js/html_to_image.js b/static/src/js/html_to_image.js index 38f5d3d..91882ee 100755 --- a/static/src/js/html_to_image.js +++ b/static/src/js/html_to_image.js @@ -41,7 +41,7 @@ export class HtmlToImageConverter { clone.style.backgroundColor = 'white'; clone.style.color = 'black'; clone.style.fontFamily = 'monospace, Courier, "Courier New"'; - clone.style.fontSize = '12px'; + clone.style.fontSize = '15px'; clone.style.lineHeight = '1.4'; // Create a temporary container to measure height @@ -113,15 +113,15 @@ export class HtmlToImageConverter { ctx.fillRect(0, 0, width, height); ctx.fillStyle = 'black'; ctx.textBaseline = 'top'; - ctx.font = '12px monospace'; + ctx.font = '16px monospace'; const padding = 10; - const lineHeight = 16; const maxWidth = width - (padding * 2); let y = padding; // Helper function to wrap text - const wrapText = (text, maxWidth) => { + const wrapText = (text, maxWidth, fontSize) => { + ctx.font = `${ctx.font.includes('bold') ? 'bold' : 'normal'} ${fontSize}px monospace`; const words = text.split(' '); const lines = []; let currentLine = ''; @@ -146,11 +146,12 @@ export class HtmlToImageConverter { }; // Helper to draw text with alignment - const drawText = (text, align = 'left', bold = false) => { + const drawText = (text, align = 'left', bold = false, fontSize = 16) => { if (!text || !text.trim()) return; - ctx.font = `${bold ? 'bold' : 'normal'} 12px monospace`; - const lines = wrapText(text, maxWidth); + ctx.font = `${bold ? 'bold' : 'normal'} ${fontSize}px monospace`; + const localLineHeight = Math.round(fontSize * 1.3); + const lines = wrapText(text, maxWidth, fontSize); for (const line of lines) { let x = padding; @@ -163,7 +164,7 @@ export class HtmlToImageConverter { } ctx.fillText(line, x, y); - y += lineHeight; + y += localLineHeight; } }; @@ -175,7 +176,7 @@ export class HtmlToImageConverter { ctx.strokeStyle = 'black'; ctx.lineWidth = 1; ctx.stroke(); - y += lineHeight; + y += 8; }; // Extract and render content recursively @@ -195,9 +196,20 @@ export class HtmlToImageConverter { const fontWeight = style.fontWeight; const isBold = fontWeight === 'bold' || parseInt(fontWeight) >= 600; + // Get font size and scale it up for high legibility on thermal printer + let fontSize = 16; + const fontSizeStr = style.fontSize; + if (fontSizeStr) { + const parsed = parseFloat(fontSizeStr); + if (!isNaN(parsed) && parsed > 0) { + fontSize = Math.max(12, Math.round(parsed * 1.35)); + } + } + const localLineHeight = Math.round(fontSize * 1.3); + // Handle special elements if (tagName === 'BR') { - y += lineHeight; + y += localLineHeight; return; } @@ -206,6 +218,22 @@ export class HtmlToImageConverter { return; } + // Special optimization: If the element is a product-name, print quantity and name inline + if (el.classList && el.classList.contains('product-name')) { + const qtyEl = el.querySelector('.qty') || el.querySelector('span:first-child'); + const nameEl = el.querySelector('.text-wrap') || el.querySelector('span:nth-child(2)') || el.querySelector('span:last-child'); + const qtyText = qtyEl ? qtyEl.textContent.trim() : ''; + let nameText = nameEl ? nameEl.textContent.trim() : ''; + if (!nameText && !qtyEl && el.textContent) { + nameText = el.textContent.trim(); + } + if (qtyText || nameText) { + const combined = qtyText ? `${qtyText} ${nameText}` : nameText; + drawText(combined, textAlign, isBold, fontSize); + return; + } + } + // Check if element has only text content (no child elements) const hasOnlyText = Array.from(el.childNodes).every( node => node.nodeType === Node.TEXT_NODE @@ -214,7 +242,7 @@ export class HtmlToImageConverter { if (hasOnlyText) { const text = el.textContent.trim(); if (text) { - drawText(text, textAlign, isBold); + drawText(text, textAlign, isBold, fontSize); } } else { // Process children @@ -222,7 +250,7 @@ export class HtmlToImageConverter { if (child.nodeType === Node.TEXT_NODE) { const text = child.textContent.trim(); if (text) { - drawText(text, textAlign, isBold); + drawText(text, textAlign, isBold, fontSize); } } else if (child.nodeType === Node.ELEMENT_NODE) { processElement(child); @@ -232,7 +260,7 @@ export class HtmlToImageConverter { // Add spacing after block elements if (display === 'block' || tagName === 'DIV' || tagName === 'P' || tagName === 'TABLE') { - y += lineHeight / 2; + y += localLineHeight / 2; } }; @@ -247,7 +275,7 @@ export class HtmlToImageConverter { const lines = allText.split('\n').filter(l => l.trim()); y = padding; for (const line of lines) { - drawText(line.trim()); + drawText(line.trim(), 'left', false, 16); } } }