Respostas HTTP
A classe PdfResponse fornece helpers de resposta HTTP seguras e compatíveis com os padrões para entregar PDFs ao navegador. Ela define todos os headers necessários automaticamente, incluindo headers de segurança que previnem MIME-sniffing e cache de documentos sensíveis.
use Yeeefang\TcpdfNext\Laravel\Http\PdfResponse;Exibição Inline
Renderize o PDF diretamente no visualizador embutido do navegador com 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");
}Forçar Download
Acione o diálogo de salvamento do navegador com 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");
}Headers de Segurança
Tanto inline() quanto download() definem automaticamente estes headers:
| Header | Valor | Finalidade |
|---|---|---|
Content-Type | application/pdf | Tipo MIME correto |
Content-Disposition | inline ou attachment | Modo de exibição |
X-Content-Type-Options | nosniff | Prevenir ataques de MIME-sniffing |
Cache-Control | no-store, no-cache, must-revalidate | Prevenir cache de PDFs sensíveis |
Content-Length | <byte count> | Habilita barras de progresso de download |
Esses padrões seguem as recomendações de secure headers do OWASP.
Streaming de PDFs Grandes
Para documentos que excedem a memória disponível, transmita chunks diretamente para o buffer de saída:
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 uma StreamedResponse com uso constante de memória independentemente do tamanho do documento.
Assinaturas 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 Response
O pacote registra dois macros de response por conveniência:
return response()->pdf($pdf, 'report.pdf'); // download
return response()->pdfInline($pdf, 'report.pdf'); // inlineEsses macros delegam para métodos do PdfResponse, então todos os headers de segurança são aplicados.
Sanitização de Nomes de Arquivo
O PdfResponse sanitiza o nome do arquivo para prevenir injeção de headers. Caracteres fora de [a-zA-Z0-9._-] são removidos e .pdf é imposto:
// Input: "../../etc/passwd" -> Sanitized: "etcpasswd.pdf"
return PdfResponse::download($pdf, $userInput);Próximos Passos
- Facade Pdf -- Criação de documentos e testes
- Queue Jobs -- Transfira PDFs pesados para workers em background
- Configuração -- Personalize headers e comportamento padrão