Scientific Drawing Template Generator Scientific Drawing Template Generator Data Configuration Drawing Dashboard 1. Specimen & Drawing Details Drawing Title (e.g., Cross-section of Zea mays Stem) Specimen/Species Name Magnification Drawn By Date Drawn 2. Scale & Context Collection/Source Information Scale Bar Unit Micrometers (μm) Millimeters (mm) Scale Bar Value Number of Label Lines to Include 5 8 12 Generate Template Configure details in the Data Configuration tab and click "Generate Template." Download Template as PDF Previous Next Drawing Space Scale: Represents ${data.scaleValue} ${data.scaleUnit === 'microns' ? 'μm' : 'mm'} Labels / Annotation Key ${labelsHtml} `; templateContentDiv.innerHTML = templateHtml; }; generateBtn.addEventListener("click", function() { generateTemplate(); showTab(1); // Switch to Dashboard }); // --- Initial Date Setter --- var today = new Date().toISOString().split('T')[0]; if (dateInput) { dateInput.value = today; } // --- PDF Download --- pdfBtn.addEventListener("click", function() { var jsPDF = window.jspdf.jsPDF; var titleSlug = drawingTitleInput.value.replace(/[^a-zA-Z0-9\s]/g, '').replace(/\s/g, '_').substring(0, 30) || 'Drawing_Template'; var fileName = `${titleSlug}.pdf`; // Temporarily adjust scale bar display for optimal PDF output size var scaleBarDiv = document.getElementById('sdt-scale-bar'); if(scaleBarDiv) scaleBarDiv.style.width = '150px'; // Fix width for consistent visual size in PDF html2canvas(exportArea, { scale: 2, useCORS: true, backgroundColor: '#ffffff' }).then(function(canvas) { // Restore original scale bar styling if(scaleBarDiv) scaleBarDiv.style.width = '100%'; var imgData = canvas.toDataURL('image/png'); var doc = new jsPDF({ orientation: 'p', unit: 'pt', format: 'letter' }); var pdfWidth = doc.internal.pageSize.getWidth(); var pdfHeight = doc.internal.pageSize.getHeight(); var imgProps = doc.getImageProperties(imgData); var imgWidth = imgProps.width; var imgHeight = imgProps.height; var margin = 40; var usableWidth = pdfWidth - (2 * margin); var ratio = usableWidth / imgWidth; var scaledHeight = imgHeight * ratio; if (scaledHeight > pdfHeight - (2 * margin)) { var pageHeight = pdfHeight - (2 * margin); var heightLeft = scaledHeight; var position = 0; while (heightLeft > 0) { doc.addImage(imgData, 'PNG', margin, position + margin, usableWidth, scaledHeight); heightLeft -= pageHeight; position -= pageHeight; if (heightLeft > 0) { doc.addPage(); } } } else { // Single page doc.addImage(imgData, 'PNG', margin, margin, usableWidth, scaledHeight); } doc.save(fileName); }).catch(function(err) { if(scaleBarDiv) scaleBarDiv.style.width = '100%'; // Restore on error console.error("SDT PDF Error:", err); // alert("An error occurred while generating the PDF."); // Per spec }); }); // --- Initial Load --- generateTemplate(); showTab(0); });