MCP
mineralogical
collection
professionals
Specimen Code
SPECIMENS CODE:
DATE:
Specimen
Processing…
`; } async function directPrint(size){ hideModal('modal-export'); const exportCanvas = buildExportCanvas(); const jpgBlob = await canvasToBlobAsync(exportCanvas, 'image/jpeg', 0.95); const dataUrl = await new Promise(resolve => { const fr = new FileReader(); fr.onload = e => resolve(e.target.result); fr.readAsDataURL(jpgBlob); }); const html = buildPrintHtml(size, dataUrl); const w = window.open('', '_blank'); if(!w){ alert('Could not open print window. Please allow pop-ups or use the PDF export.'); return; } w.document.open(); w.document.write(html); w.document.close(); } async function savePdf(size){ hideModal('modal-export'); const exportCanvas = buildExportCanvas(); const jpegBlob = await canvasToBlobAsync(exportCanvas, 'image/jpeg', 0.92); const jpegUrl = await new Promise(resolve => { const fr = new FileReader(); fr.onload = e => resolve(e.target.result); fr.readAsDataURL(jpegBlob); }); const jpegBytes = dataUrlToUint8Array(jpegUrl); const page = size === 'A5' ? {w:419.53, h:595.28, label:'A5'} : {w:595.28, h:841.89, label:'A4'}; const pdfBlob = buildSimpleImagePdf(jpegBytes, exportCanvas.width, exportCanvas.height, page.w, page.h, page.label); const link = document.createElement('a'); const code = (S.specimenCode || 'specimen').replace(/\s+/g,'-'); link.download = `MCP-${code}-${Date.now()}-${page.label}.pdf`; link.href = URL.createObjectURL(pdfBlob); link.click(); } if('serviceWorker' in navigator){navigator.serviceWorker.register('./sw.js').catch(()=>{});}