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.
use Yeeefang\TcpdfNext\Laravel\Http\PdfResponse;Affichage inline
Rendre le PDF directement dans le visualiseur intégré du navigateur avec Content-Disposition: inline :
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 :
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ête | Valeur | Objectif |
|---|---|---|
Content-Type | application/pdf | Type MIME correct |
Content-Disposition | inline ou attachment | Mode d'affichage |
X-Content-Type-Options | nosniff | Empêcher les attaques par MIME-sniffing |
Cache-Control | no-store, no-cache, must-revalidate | Empê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 :
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
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é :
return response()->pdf($pdf, 'report.pdf'); // download
return response()->pdfInline($pdf, 'report.pdf'); // inlineCes 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é :
// 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