Experimental Report Writer
Review Your Report
Experiment Date: ${reportData.date}
Abstract
${reportData.abstract}
Introduction
${reportData.introduction}
Materials and Methods
${reportData.methods}
Results
${reportData.results}
Discussion & Conclusion
${reportData.discussion}
`; }; const getReportData = () => { const title = document.getElementById('report-title').value.trim() || 'Untitled Report'; const author = document.getElementById('report-author').value.trim() || 'N/A'; const dateRaw = document.getElementById('report-date').value; const date = dateRaw ? new Date(dateRaw).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric', timeZone: 'UTC' }) : 'N/A'; return { title, author, date, abstract: document.getElementById('report-abstract').value.trim() || 'No abstract provided.', introduction: document.getElementById('report-introduction').value.trim() || 'No introduction provided.', methods: document.getElementById('report-methods').value.trim() || 'No methods provided.', results: document.getElementById('report-results').value.trim() || 'No results provided.', discussion: document.getElementById('report-discussion').value.trim() || 'No discussion provided.', }; }; tabs.forEach(tab => { tab.addEventListener('click', () => { currentTabIndex = tabIds.indexOf(tab.dataset.tab); updateTabs(); }); }); prevButton.addEventListener('click', () => { if (currentTabIndex > 0) { currentTabIndex--; updateTabs(); } }); nextButton.addEventListener('click', () => { if (currentTabIndex < tabIds.length - 1) { currentTabIndex++; updateTabs(); } }); downloadPdfButton.addEventListener('click', () => { downloadPdfButton.textContent = 'Generating...'; downloadPdfButton.disabled = true; try { generateReportPdf(getReportData()); } catch(e) { console.error("PDF Generation Failed:", e); alert("An error occurred while generating the PDF."); } finally { downloadPdfButton.textContent = 'Download Report as PDF'; downloadPdfButton.disabled = false; } }); const generateReportPdf = (data) => { const { jsPDF } = window.jspdf; const doc = new jsPDF({ orientation: 'p', unit: 'mm', format: 'a4' }); const pageWidth = doc.internal.pageSize.getWidth(); const margin = 20; const contentWidth = pageWidth - (margin * 2); let y = margin; const addWrappedText = (text, options) => { const { isHeader = false, fontSize = 11, lineSpacing = 6 } = options; doc.setFont('times', isHeader ? 'bold' : 'normal'); doc.setFontSize(fontSize); doc.setTextColor(isHeader ? '#000000' : '#333333'); const lines = doc.splitTextToSize(text, contentWidth); if (y + (lines.length * lineSpacing) > doc.internal.pageSize.getHeight() - margin) { doc.addPage(); y = margin; } if (isHeader) { y += lineSpacing; // Extra space before header } doc.text(lines, margin, y); y += (lines.length * lineSpacing); }; // Report Title doc.setFont('times', 'bold'); doc.setFontSize(18); doc.text(data.title, pageWidth / 2, y, { align: 'center' }); y += 10; // Author and Date doc.setFont('times', 'normal'); doc.setFontSize(12); doc.text(data.author, pageWidth / 2, y, { align: 'center' }); y += 6; doc.text(`Date of Experiment: ${data.date}`, pageWidth / 2, y, { align: 'center' }); y += 15; // Sections addWrappedText("Abstract", { isHeader: true, fontSize: 14 }); addWrappedText(data.abstract, {}); addWrappedText("Introduction", { isHeader: true, fontSize: 14 }); addWrappedText(data.introduction, {}); addWrappedText("Materials and Methods", { isHeader: true, fontSize: 14 }); addWrappedText(data.methods, {}); addWrappedText("Results", { isHeader: true, fontSize: 14 }); addWrappedText(data.results, {}); addWrappedText("Discussion & Conclusion", { isHeader: true, fontSize: 14 }); addWrappedText(data.discussion, {}); // Footer const pageCount = doc.internal.getNumberOfPages(); for(let i = 1; i <= pageCount; i++) { doc.setPage(i); doc.setFontSize(10); doc.setTextColor('#888888'); doc.text(`${i}`, pageWidth / 2, doc.internal.pageSize.getHeight() - 10, { align: 'center' }); } doc.save('Experimental-Report.pdf'); }; // Initial setup document.getElementById('report-date').valueAsDate = new Date(); updateTabs(); });