import { X, Download } from "lucide-react"; import { jsPDF } from "jspdf"; import { useState } from "react"; interface PresidioModalProps { anonymizedText: string | null; piiCount: number; onClose: () => void; } const renderAnonymizedTextOnPdf = (pdf: jsPDF, anonymizedText: string) => { const pageHeight = pdf.internal.pageSize.getHeight(); const pageWidth = pdf.internal.pageSize.getWidth(); const margin = 15; let cursorY = margin; const paragraphs = anonymizedText.split("\n\n").filter((p) => p.trim()); paragraphs.forEach((paragraph) => { if (cursorY > pageHeight - margin - 20) { pdf.addPage(); cursorY = margin; } const parts = paragraph.split(/(<[A-Z_]+>)/g); parts.forEach((part) => { if (part.match(/<[A-Z_]+>/)) { pdf.setFontSize(10); pdf.setFont("Helvetica", "bold"); pdf.setTextColor(255, 0, 0); const lines = pdf.splitTextToSize(part, pageWidth - margin * 2); pdf.text(lines, margin, cursorY); cursorY += lines.length * 10 * 0.5; } else if (part.trim()) { pdf.setFontSize(10); pdf.setFont("Helvetica", "normal"); pdf.setTextColor(0, 0, 0); const lines = pdf.splitTextToSize(part, pageWidth - margin * 2); pdf.text(lines, margin, cursorY); cursorY += lines.length * 10 * 0.5; } }); cursorY += 8; }); }; const formatAnonymizedTextForPreview = (text: string): string => { return text .split("\n\n") .map((paragraph) => { const formattedParagraph = paragraph.replace( /<([A-Z_]+)>/g, '<$1>' ); return `
${formattedParagraph}
`; }) .join(""); }; export default function PresidioModal({ anonymizedText, piiCount, onClose, }: PresidioModalProps) { const [isDownloading, setIsDownloading] = useState(false); if (!anonymizedText) return null; const handleDownloadPdf = async () => { setIsDownloading(true); try { const pdf = new jsPDF({ orientation: "p", unit: "mm", format: "a4" }); pdf.setFontSize(16); pdf.setFont("Helvetica", "bold"); pdf.setTextColor(0, 0, 0); pdf.text("Document Anonymisé par Presidio", 15, 20); pdf.setFontSize(10); pdf.setFont("Helvetica", "normal"); pdf.text( `Données personnelles détectées et anonymisées : ${piiCount}`, 15, 30 ); pdf.setDrawColor(0, 0, 0); pdf.line(15, 35, pdf.internal.pageSize.getWidth() - 15, 35); pdf.setFontSize(10); renderAnonymizedTextOnPdf(pdf, anonymizedText); pdf.save("document_anonymise_presidio.pdf"); } catch (error) { console.error("Erreur lors de la génération du PDF:", error); } finally { setIsDownloading(false); } }; const previewHtml = `${piiCount} données personnelles détectées et anonymisées