/** * Print HTML content using iframe approach * @param {string} htmlContent - Complete HTML string to print * @param {string} additionalStyles - Optional additional CSS styles * @returns {Promise} */ export async function printHtml(htmlContent, additionalStyles = '') { return new Promise((resolve, reject) => { try { // Create hidden iframe const iframe = document.createElement('iframe'); iframe.style.position = 'absolute'; iframe.style.width = '0px'; iframe.style.height = '0px'; iframe.style.border = 'none'; iframe.style.visibility = 'hidden'; document.body.appendChild(iframe); const doc = iframe.contentWindow.document; doc.open(); // Write the complete HTML content doc.write(htmlContent); // Add additional styles if provided if (additionalStyles) { doc.write(``); } doc.close(); // Handle print completion iframe.contentWindow.onafterprint = () => { document.body.removeChild(iframe); resolve(); }; // Wait for content to load before printing iframe.contentWindow.onload = () => { console.log('Print content loaded'); setTimeout(() => { iframe.contentWindow.focus(); iframe.contentWindow.print(); }, 300); // Allow rendering delay }; } catch (error) { console.error('Error in printHtml:', error); reject(error); } }); } /** * Print template with data binding * @param {object} template - Template object with elements and page config * @param {object} data - Data object for binding * @returns {Promise} */ export async function printTemplate(template, data = {}) { const { generateHtml } = await import('./exportToHtml'); const html = generateHtml(template, data); return printHtml(html); }