interface interactive
This commit is contained in:
@@ -15,7 +15,7 @@ export async function POST(req: NextRequest) {
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// Vérifications supplémentaires
|
||||
if (file.size === 0) {
|
||||
return NextResponse.json(
|
||||
@@ -23,19 +23,20 @@ export async function POST(req: NextRequest) {
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
if (file.size > 50 * 1024 * 1024) { // 50MB
|
||||
|
||||
if (file.size > 50 * 1024 * 1024) {
|
||||
// 50MB
|
||||
return NextResponse.json(
|
||||
{ error: "Le fichier est trop volumineux (max 50MB)." },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
console.log("📁 Fichier reçu:", {
|
||||
name: file.name,
|
||||
type: file.type,
|
||||
size: `${(file.size / 1024 / 1024).toFixed(2)} MB`,
|
||||
lastModified: new Date(file.lastModified).toISOString()
|
||||
lastModified: new Date(file.lastModified).toISOString(),
|
||||
});
|
||||
|
||||
let fileContent = "";
|
||||
@@ -45,55 +46,56 @@ export async function POST(req: NextRequest) {
|
||||
if (fileType === "application/pdf") {
|
||||
console.log("📄 Traitement PDF en cours...");
|
||||
console.log("📊 Taille du fichier:", file.size, "bytes");
|
||||
|
||||
|
||||
try {
|
||||
const buffer = Buffer.from(await file.arrayBuffer());
|
||||
console.log("📦 Buffer créé, taille:", buffer.length);
|
||||
|
||||
|
||||
const data = await pdf(buffer);
|
||||
fileContent = data.text || "";
|
||||
|
||||
|
||||
console.log("✅ Extraction PDF réussie, longueur:", fileContent.length);
|
||||
console.log("📄 Nombre de pages:", data.numpages);
|
||||
console.log("ℹ️ Info PDF:", data.info?.Title || "Titre non disponible");
|
||||
|
||||
|
||||
// ✅ Vérification améliorée
|
||||
if (!fileContent.trim()) {
|
||||
console.log("⚠️ PDF vide - Détails:", {
|
||||
pages: data.numpages,
|
||||
metadata: data.metadata,
|
||||
info: data.info,
|
||||
extractedLength: fileContent.length
|
||||
extractedLength: fileContent.length,
|
||||
});
|
||||
|
||||
|
||||
// Détecter si c'est un PDF scanné
|
||||
const isScanned = data.info?.Creator?.includes('RICOH') ||
|
||||
data.info?.Creator?.includes('Canon') ||
|
||||
data.info?.Creator?.includes('HP') ||
|
||||
data.info?.Producer?.includes('Scanner') ||
|
||||
(data.numpages > 0 && fileContent.length < 50);
|
||||
|
||||
const errorMessage = isScanned
|
||||
const isScanned =
|
||||
data.info?.Creator?.includes("RICOH") ||
|
||||
data.info?.Creator?.includes("Canon") ||
|
||||
data.info?.Creator?.includes("HP") ||
|
||||
data.info?.Producer?.includes("Scanner") ||
|
||||
(data.numpages > 0 && fileContent.length < 50);
|
||||
|
||||
const errorMessage = isScanned
|
||||
? `Ce PDF semble être un document scanné (créé par: ${data.info?.Creator}). Les documents scannés contiennent des images de texte, pas du texte extractible.\n\n💡 Solutions :\n- Utilisez un PDF créé depuis Word/Google Docs\n- Appliquez l'OCR avec Adobe Acrobat\n- Recréez le document au lieu de le scanner`
|
||||
: `Le PDF ne contient pas de texte extractible.\n\nCela peut être dû à :\n- PDF scanné (image uniquement)\n- PDF protégé\n- PDF avec texte en images\n- Nombre de pages: ${data.numpages}`;
|
||||
|
||||
return NextResponse.json(
|
||||
{ error: errorMessage },
|
||||
{ status: 400 }
|
||||
);
|
||||
|
||||
return NextResponse.json({ error: errorMessage }, { status: 400 });
|
||||
}
|
||||
} catch (pdfError) {
|
||||
console.error("❌ Erreur PDF détaillée:", {
|
||||
message: pdfError instanceof Error ? pdfError.message : "Erreur inconnue",
|
||||
message:
|
||||
pdfError instanceof Error ? pdfError.message : "Erreur inconnue",
|
||||
stack: pdfError instanceof Error ? pdfError.stack : undefined,
|
||||
fileName: file.name,
|
||||
fileSize: file.size,
|
||||
fileType: file.type
|
||||
fileType: file.type,
|
||||
});
|
||||
|
||||
|
||||
return NextResponse.json(
|
||||
{
|
||||
error: `Impossible de traiter ce PDF (${file.name}). Erreur: ${pdfError instanceof Error ? pdfError.message : "Erreur inconnue"}. Vérifiez que le PDF n'est pas protégé, corrompu ou scanné.`,
|
||||
error: `Impossible de traiter ce PDF (${file.name}). Erreur: ${
|
||||
pdfError instanceof Error ? pdfError.message : "Erreur inconnue"
|
||||
}. Vérifiez que le PDF n'est pas protégé, corrompu ou scanné.`,
|
||||
},
|
||||
{ status: 500 }
|
||||
);
|
||||
@@ -170,10 +172,10 @@ export async function POST(req: NextRequest) {
|
||||
};
|
||||
|
||||
console.log("🔍 Appel à Presidio Analyzer...");
|
||||
|
||||
|
||||
// ✅ Définir l'URL AVANT de l'utiliser
|
||||
const presidioAnalyzerUrl = "http://analyzer.151.80.20.211.sslip.io/analyze";
|
||||
|
||||
const presidioAnalyzerUrl = "http://localhost:5001/analyze";
|
||||
|
||||
try {
|
||||
const analyzeResponse = await fetch(presidioAnalyzerUrl, {
|
||||
method: "POST",
|
||||
@@ -183,10 +185,10 @@ export async function POST(req: NextRequest) {
|
||||
},
|
||||
body: JSON.stringify(analyzerConfig),
|
||||
});
|
||||
|
||||
|
||||
console.log("📊 Statut Analyzer:", analyzeResponse.status);
|
||||
console.log("📊 Headers Analyzer:", analyzeResponse.headers);
|
||||
|
||||
|
||||
if (!analyzeResponse.ok) {
|
||||
const errorBody = await analyzeResponse.text();
|
||||
console.error("❌ Erreur Analyzer:", errorBody);
|
||||
@@ -209,8 +211,7 @@ export async function POST(req: NextRequest) {
|
||||
};
|
||||
|
||||
console.log("🔍 Appel à Presidio Anonymizer...");
|
||||
const presidioAnonymizerUrl =
|
||||
"http://anonymizer.151.80.20.211.sslip.io/anonymize";
|
||||
const presidioAnonymizerUrl = "http://localhost:5001/anonymize";
|
||||
|
||||
const anonymizeResponse = await fetch(presidioAnonymizerUrl, {
|
||||
method: "POST",
|
||||
@@ -232,13 +233,66 @@ export async function POST(req: NextRequest) {
|
||||
const anonymizerResult = await anonymizeResponse.json();
|
||||
console.log("✅ Anonymisation réussie.");
|
||||
|
||||
// 🔧 NOUVELLE FONCTION SIMPLIFIÉE pour extraire les valeurs de remplacement
|
||||
// Ajouter cette interface au début du fichier
|
||||
interface AnalyzerResult {
|
||||
entity_type: string;
|
||||
start: number;
|
||||
end: number;
|
||||
score: number;
|
||||
}
|
||||
|
||||
// Puis modifier la fonction
|
||||
const extractReplacementValues = (originalText: string, anonymizedText: string, analyzerResults: AnalyzerResult[]) => {
|
||||
const replacementMap: Record<string, string> = {};
|
||||
|
||||
// Créer une copie du texte anonymisé pour le traitement
|
||||
const workingText = anonymizedText; // ✅ Changé de 'let' à 'const'
|
||||
// Supprimer workingOriginal car elle n'est jamais utilisée
|
||||
|
||||
// Trier les résultats par position (du plus grand au plus petit pour éviter les décalages)
|
||||
const sortedResults = [...analyzerResults].sort((a, b) => b.start - a.start);
|
||||
|
||||
for (const result of sortedResults) {
|
||||
const originalValue = originalText.substring(result.start, result.end);
|
||||
|
||||
// Extraire les parties avant et après l'entité dans le texte original
|
||||
const beforeOriginal = originalText.substring(0, result.start);
|
||||
const afterOriginal = originalText.substring(result.end);
|
||||
|
||||
// Trouver les mêmes parties dans le texte anonymisé
|
||||
const beforeIndex = workingText.indexOf(beforeOriginal);
|
||||
const afterIndex = workingText.lastIndexOf(afterOriginal);
|
||||
|
||||
if (beforeIndex !== -1 && afterIndex !== -1) {
|
||||
// Extraire la valeur de remplacement entre ces deux parties
|
||||
const startPos = beforeIndex + beforeOriginal.length;
|
||||
const endPos = afterIndex;
|
||||
const replacementValue = workingText.substring(startPos, endPos);
|
||||
|
||||
// Vérifier que c'est bien un remplacement (commence par [ et finit par ])
|
||||
if (replacementValue.startsWith('[') && replacementValue.endsWith(']')) {
|
||||
replacementMap[originalValue] = replacementValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return replacementMap;
|
||||
};
|
||||
|
||||
const replacementValues = extractReplacementValues(fileContent, anonymizerResult.anonymized_text, analyzerResults);
|
||||
|
||||
// 🔍 AJOUT D'UN LOG POUR DÉBOGUER
|
||||
console.log("🔧 Valeurs de remplacement extraites:", replacementValues);
|
||||
|
||||
const result = {
|
||||
text: fileContent,
|
||||
anonymizedText: anonymizerResult.text,
|
||||
anonymizedText: anonymizerResult.anonymized_text,
|
||||
piiCount: analyzerResults.length,
|
||||
analyzerResults: analyzerResults,
|
||||
replacementValues: replacementValues // Utiliser les nouvelles valeurs
|
||||
};
|
||||
|
||||
|
||||
return NextResponse.json(result, { status: 200 });
|
||||
} catch (presidioError) {
|
||||
console.error("❌ Erreur Presidio:", presidioError);
|
||||
|
||||
Reference in New Issue
Block a user