Respuestas HTTP
La clase PdfResponse proporciona helpers de respuesta HTTP seguros y conformes con estándares para entregar PDFs al navegador. Establece todas las cabeceras requeridas automáticamente, incluyendo cabeceras de seguridad que previenen MIME-sniffing y caché de documentos sensibles.
use Yeeefang\TcpdfNext\Laravel\Http\PdfResponse;Visualización inline
Renderiza el PDF directamente en el visor integrado del navegador con 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");
}Forzar descarga
Activa el diálogo de guardar archivo del navegador con 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");
}Cabeceras de seguridad
Tanto inline() como download() establecen automáticamente estas cabeceras:
| Cabecera | Valor | Propósito |
|---|---|---|
Content-Type | application/pdf | Tipo MIME correcto |
Content-Disposition | inline o attachment | Modo de visualización |
X-Content-Type-Options | nosniff | Prevenir ataques de MIME-sniffing |
Cache-Control | no-store, no-cache, must-revalidate | Prevenir caché de PDFs sensibles |
Content-Length | <conteo de bytes> | Habilita barras de progreso de descarga |
Estos valores predeterminados siguen las recomendaciones de cabeceras seguras de OWASP.
Streaming de PDFs grandes
Para documentos que exceden la memoria disponible, transmite bloques directamente al buffer de salida:
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() retorna un StreamedResponse con uso de memoria constante independientemente del tamaño del documento.
Firmas de métodos
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 respuesta
El paquete registra dos macros de respuesta por conveniencia:
return response()->pdf($pdf, 'report.pdf'); // download
return response()->pdfInline($pdf, 'report.pdf'); // inlineEstas macros delegan a los métodos de PdfResponse, por lo que todas las cabeceras de seguridad se aplican.
Sanitización de nombre de archivo
PdfResponse sanitiza el nombre de archivo para prevenir inyección de cabeceras. Los caracteres fuera de [a-zA-Z0-9._-] se eliminan y .pdf se aplica obligatoriamente:
// Input: "../../etc/passwd" -> Sanitized: "etcpasswd.pdf"
return PdfResponse::download($pdf, $userInput);Próximos pasos
- Facade Pdf -- Creación de documentos y testing
- Queue Jobs -- Delegar PDFs pesados a workers en segundo plano
- Configuración -- Personalizar cabeceras y comportamiento predeterminados