espace-paie-odentas/app/api/pdf-clean/route.ts
odentas 59749d481b feat: Migration Cloudinary vers Poppler pour conversion PDF→JPEG
- Remplacer Cloudinary (US) par solution 100% AWS eu-west-3
- Lambda odentas-sign-pdf-converter avec pdftoppm
- Lambda Layer poppler-utils v5 avec dépendances complètes
- Trigger S3 ObjectCreated pour conversion automatique
- Support multi-pages validé (PDF 3 pages)
- Stockage images dans S3 odentas-docs
- PDFImageViewer pour affichage images converties
- Conformité RGPD garantie (données EU uniquement)
2025-10-28 10:22:45 +01:00

65 lines
2 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server';
import { PDFDocument } from 'pdf-lib';
export async function GET(request: NextRequest) {
try {
const { searchParams } = new URL(request.url);
const pdfUrl = searchParams.get('url');
const requestId = searchParams.get('requestId');
if (!pdfUrl) {
return NextResponse.json(
{ error: 'URL du PDF requise' },
{ status: 400 }
);
}
// Récupérer le PDF depuis S3
const response = await fetch(decodeURIComponent(pdfUrl));
if (!response.ok) {
return NextResponse.json(
{ error: `Erreur S3: ${response.status}` },
{ status: response.status }
);
}
const pdfBytes = await response.arrayBuffer();
try {
// Charger le PDF avec pdf-lib
const pdfDoc = await PDFDocument.load(pdfBytes);
const pages = pdfDoc.getPages();
// Parcourir chaque page et extraire les annotations
// Note: pdf-lib ne peut pas modifier directement le texte rendu
// On va donc simplement retourner le PDF tel quel
// car les placeholders seront masqués par les overlays de signature
const modifiedPdfBytes = await pdfDoc.save();
return new NextResponse(Buffer.from(modifiedPdfBytes), {
headers: {
'Content-Type': 'application/pdf',
'Cache-Control': 'public, max-age=3600',
'Access-Control-Allow-Origin': '*',
},
});
} catch (error) {
console.error('Erreur parsing PDF avec pdf-lib:', error);
// En cas d'erreur, retourner le PDF original
return new NextResponse(Buffer.from(pdfBytes), {
headers: {
'Content-Type': 'application/pdf',
'Cache-Control': 'public, max-age=3600',
'Access-Control-Allow-Origin': '*',
},
});
}
} catch (error) {
console.error('Erreur nettoyage PDF:', error);
return NextResponse.json(
{ error: 'Erreur serveur' },
{ status: 500 }
);
}
}