Skip to content

Réponses HTTP

La classe PdfResponse fournit des helpers de réponse HTTP sécurisés et conformes aux standards pour livrer des PDF au navigateur. Elle définit automatiquement tous les en-têtes requis, incluant les en-têtes de sécurité qui empêchent le MIME-sniffing et la mise en cache de documents sensibles.

php
use Yeeefang\TcpdfNext\Laravel\Http\PdfResponse;

Affichage inline

Rendre le PDF directement dans le visualiseur intégré du navigateur avec Content-Disposition: inline :

php
use Yeeefang\TcpdfNext\Laravel\Facades\Pdf;
use Yeeefang\TcpdfNext\Laravel\Http\PdfResponse;

public function preview(Invoice $invoice)
{
    $pdf = Pdf::create()
        ->setTitle("Invoice #{$invoice->number}")
        ->addPage()
        ->setFont('Helvetica', '', 12)
        ->cell(0, 10, "Invoice #{$invoice->number}");

    return PdfResponse::inline($pdf, "invoice-{$invoice->number}.pdf");
}

Forcer le téléchargement

Déclencher la boîte de dialogue de sauvegarde du navigateur avec Content-Disposition: attachment :

php
public function download(Invoice $invoice)
{
    $pdf = Pdf::create()
        ->setTitle("Invoice #{$invoice->number}")
        ->addPage()
        ->setFont('Helvetica', '', 12)
        ->cell(0, 10, "Invoice #{$invoice->number}");

    return PdfResponse::download($pdf, "invoice-{$invoice->number}.pdf");
}

En-têtes de sécurité

inline() et download() définissent automatiquement ces en-têtes :

En-têteValeurObjectif
Content-Typeapplication/pdfType MIME correct
Content-Dispositioninline ou attachmentMode d'affichage
X-Content-Type-OptionsnosniffEmpêcher les attaques par MIME-sniffing
Cache-Controlno-store, no-cache, must-revalidateEmpêcher la mise en cache de PDF sensibles
Content-Length<nombre d'octets>Active les barres de progression de téléchargement

Ces valeurs par défaut suivent les recommandations OWASP secure headers.

Streaming de grands PDF

Pour les documents qui dépassent la mémoire disponible, diffusez les morceaux directement vers le buffer de sortie :

php
public function downloadLargeReport()
{
    $pdf = Pdf::create()->setTitle('Annual Report');

    foreach ($sections as $section) {
        $pdf->addPage()
            ->setFont('Helvetica', '', 11)
            ->multiCell(0, 6, $section->content);
    }

    return PdfResponse::stream($pdf, 'annual-report.pdf');
}

PdfResponse::stream() retourne une StreamedResponse avec utilisation mémoire constante quelle que soit la taille du document.

Signatures de méthodes

php
public static function inline(PdfDocumentInterface $pdf, string $filename): Response;
public static function download(PdfDocumentInterface $pdf, string $filename): Response;
public static function stream(PdfDocumentInterface $pdf, string $filename): StreamedResponse;

Macros de réponse

Le package enregistre deux macros de réponse pour la commodité :

php
return response()->pdf($pdf, 'report.pdf');         // download
return response()->pdfInline($pdf, 'report.pdf');   // inline

Ces macros délèguent aux méthodes PdfResponse, donc tous les en-têtes de sécurité sont appliqués.

Assainissement du nom de fichier

PdfResponse assainit le nom de fichier pour empêcher l'injection d'en-tête. Les caractères hors de [a-zA-Z0-9._-] sont supprimés et .pdf est forcé :

php
// Entrée : "../../etc/passwd"  ->  Assaini : "etcpasswd.pdf"
return PdfResponse::download($pdf, $userInput);

Prochaines étapes

  • Facade Pdf — Création de document et test
  • Tâches de file — Décharger les PDF lourds vers workers en arrière-plan
  • Configuration — Personnaliser les en-têtes et comportement par défaut

Distribué sous licence LGPL-3.0-or-later.