auditforge / frontend /src /services /exportToPDF.tsx
Kaballas's picture
initialize project structure with essential configurations and components
56b6519
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(
<CentralizedView auditId={auditId} selectedDisplays={selectedDisplays} />,
);
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);
};