Skip to content

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.

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

Visualización inline

Renderiza el PDF directamente en el visor integrado del navegador con 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");
}

Forzar descarga

Activa el diálogo de guardar archivo del navegador con 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");
}

Cabeceras de seguridad

Tanto inline() como download() establecen automáticamente estas cabeceras:

CabeceraValorPropósito
Content-Typeapplication/pdfTipo MIME correcto
Content-Dispositioninline o attachmentModo de visualización
X-Content-Type-OptionsnosniffPrevenir ataques de MIME-sniffing
Cache-Controlno-store, no-cache, must-revalidatePrevenir 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:

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() retorna un StreamedResponse con uso de memoria constante independientemente del tamaño del documento.

Firmas de métodos

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 respuesta

El paquete registra dos macros de respuesta por conveniencia:

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

Estas 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:

php
// 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

Distribuido bajo la licencia LGPL-3.0-or-later.