testtt2
Dr. Yolande Ofoueme-Berton
Année
2025
Pages
555 pages
Taille du fichier
616.24 KB
Langue
FR
Résumé
<?php namespace App\Services; use setasign\Fpdi\Fpdi; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Log; /** * Service de génération d'aperçu PDF * * Génère un PDF contenant uniquement les X premières pages d'un document */ class PdfPreviewService { /** * Générer un aperçu PDF avec un nombre limité de pages * * @param string $originalFilePath Chemin du fichier original dans storage * @param int $maxPages Nombre maximum de pages à inclure * @return string|null Chemin du fichier d'aperçu généré ou null en cas d'erreur */ public function generatePreview(string $originalFilePath, int $maxPages = 10): ?string { try { // Chemin complet du fichier original $fullPath = storage_path('app/public/' . $originalFilePath); // Vérifier que le fichier existe if (!file_exists($fullPath)) { Log::error("PdfPreviewService: Fichier introuvable - {$fullPath}"); return null; } // Créer une instance FPDI $pdf = new Fpdi(); // Obtenir le nombre total de pages $pageCount = $pdf->setSourceFile($fullPath); // Limiter au nombre de pages demandé $pagesToInclude = min($pageCount, $maxPages); // Ajouter chaque page au nouveau PDF for ($pageNo = 1; $pageNo <= $pagesToInclude; $pageNo++) { // Importer la page $templateId = $pdf->importPage($pageNo); // Obtenir la taille de la page $size = $pdf->getTemplateSize($templateId); // Ajouter une nouvelle page avec les mêmes dimensions $pdf->AddPage( $size['orientation'] ?? 'P', [$size['width'], $size['height']] ); // Utiliser le template importé $pdf->useTemplate($templateId); // Ajouter un watermark "APERÇU" sur chaque page (désactivé pour éviter les erreurs) // $this->addWatermark($pdf, $size); } // Ajouter une dernière page avec un message $this->addInfoPage($pdf, $pagesToInclude, $pageCount); // Générer le nom du fichier d'aperçu $previewPath = str_replace('.pdf', '_preview.pdf', $originalFilePath); $previewFullPath = storage_path('app/public/' . $previewPath); // Sauvegarder le PDF d'aperçu $pdf->Output('F', $previewFullPath); Log::info("PdfPreviewService: Aperçu généré avec succès - {$previewPath}"); return $previewPath; } catch (\Exception $e) { Log::error("PdfPreviewService: Erreur lors de la génération - " . $e->getMessage()); return null; } } /** * Ajouter un watermark "APERÇU" sur la page * * Version simplifiée sans transparence (SetAlpha n'existe pas dans FPDF) * * @param Fpdi $pdf Instance FPDI * @param array $size Dimensions de la page * @return void */ protected function addWatermark(Fpdi $pdf, array $size): void { // Configurer la police (texte gris clair) $pdf->SetFont('Helvetica', 'B', 50); $pdf->SetTextColor(220, 220, 220); // Gris très clair // Calculer la position (centre de la page) $width = $size['width']; $height = $size['height']; // Ajouter le texte "APERÇU" au centre $text = 'APERCU'; $textWidth = $pdf->GetStringWidth($text); $x = ($width - $textWidth) / 2; $y = $height / 2; $pdf->Text($x, $y, $text); } /** * Ajouter une page d'information à la fin de l'aperçu * * @param Fpdi $pdf Instance FPDI * @param int $includedPages Nombre de pages incluses * @param int $totalPages Nombre total de pages du document * @return void */ protected function addInfoPage(Fpdi $pdf, int $includedPages, int $totalPages): void { // Ajouter une nouvelle page A4 $pdf->AddPage('P', 'A4'); // Fond gris clair $pdf->SetFillColor(245, 245, 245); $pdf->Rect(0, 0, 210, 297, 'F'); // Titre $pdf->SetFont('Helvetica', 'B', 24); $pdf->SetTextColor(41, 128, 185); // Bleu $pdf->SetXY(20, 50); $pdf->Cell(170, 15, 'Aperçu gratuit', 0, 1, 'C'); // Informations $pdf->SetFont('Helvetica', '', 14); $pdf->SetTextColor(50, 50, 50); $pdf->SetXY(20, 80); $pdf->MultiCell(170, 8, "Vous avez consulté les {$includedPages} premières pages de ce document.\n\n" . "Document complet : {$totalPages} pages", 0, 'C'); // Séparateur $pdf->SetDrawColor(200, 200, 200); $pdf->Line(40, 120, 170, 120); // Message d'action $pdf->SetFont('Helvetica', 'B', 16); $pdf->SetTextColor(231, 76, 60); // Rouge $pdf->SetXY(20, 135); $pdf->MultiCell(170, 10, "Pour accéder au document complet :", 0, 'C'); // Instructions $pdf->SetFont('Helvetica', '', 12); $pdf->SetTextColor(50, 50, 50); $pdf->SetXY(20, 155); $pdf->MultiCell(170, 7, "1. Créez un compte sur la plateforme Ben Géo\n" . "2. Faites une demande d'accès à cette publication\n" . "3. Effectuez le paiement\n" . "4. Téléchargez le document complet", 0, 'L'); // Footer $pdf->SetFont('Helvetica', 'I', 10); $pdf->SetTextColor(150, 150, 150); $pdf->SetXY(20, 250); $pdf->Cell(170, 5, 'Ben Géo - Département de Géographie et Aménagement du Territoire', 0, 1, 'C'); $pdf->SetXY(20, 257); $pdf->Cell(170, 5, 'Université d\'Abomey-Calavi, Bénin', 0, 1, 'C'); } }
Mots-clés
Informations sur la publication
Niveau
Master
Directeur
Mohamed