import html2canvas from 'html2canvas'; import jsPDF from 'jspdf'; import ReactDOM from 'react-dom/client'; import CentralizedView from '../components/dashboard/CentralizedView'; export const exportToPDF = async ( auditName: string, selectedDisplays: string[], auditId: string, ) => { const container = document.createElement('div'); container.style.position = 'absolute'; container.style.left = '-9999px'; container.style.top = '-9999px'; document.body.appendChild(container); const root = ReactDOM.createRoot(container); root.render( , ); await new Promise(resolve => setTimeout(resolve, 2000)); const pdf = new jsPDF('p', 'mm', 'a4'); const pageWidth = pdf.internal.pageSize.getWidth(); const pageHeight = pdf.internal.pageSize.getHeight(); pdf.setFillColor(31, 41, 55); pdf.rect(0, 0, pageWidth, pageHeight, 'F'); pdf.setTextColor(255, 255, 255); pdf.setFontSize(24); pdf.text(auditName, pageWidth / 2, 20, { align: 'center' }); let yOffset = 30; const margin = 10; const availableWidth = pageWidth - 2 * margin; const maxHeight = (pageHeight - yOffset - 3 * margin) / 2; const captureAndAddChart = async (displayId: string, index: number) => { const element: HTMLElement | null = container.querySelector( `#${displayId}`, ); if (element) { try { const canvas = await html2canvas(element, { backgroundColor: '#1f2937', scale: 2, }); const imgData = canvas.toDataURL('image/png'); const aspectRatio = canvas.width / canvas.height; let imgWidth = availableWidth; let imgHeight = imgWidth / aspectRatio; if (imgHeight > maxHeight) { imgHeight = maxHeight; imgWidth = imgHeight * aspectRatio; } if (index % 2 === 0 && index !== 0) { pdf.addPage(); yOffset = 10; pdf.setFillColor(31, 41, 55); pdf.rect(0, 0, pageWidth, pageHeight, 'F'); } const xOffset = (pageWidth - imgWidth) / 2; pdf.addImage( imgData, 'PNG', xOffset, yOffset, imgWidth, imgHeight, undefined, 'FAST', ); yOffset += imgHeight + margin; if (index % 2 === 1) { yOffset = 10; } } catch (error) { console.error('Error capturing element:', error); pdf.setTextColor(255, 255, 255); pdf.text('Error capturing chart', margin, yOffset); yOffset += 20; } } }; for (let i = 0; i < selectedDisplays.length; i++) { await captureAndAddChart(selectedDisplays[i], i); } pdf.save(`${auditName}.pdf`); root.unmount(); document.body.removeChild(container); };