HTTP-ответы
Класс PdfResponse предоставляет безопасные, соответствующие стандартам хелперы HTTP-ответов для доставки PDF в браузер. Он автоматически устанавливает все необходимые заголовки, включая заголовки безопасности, предотвращающие MIME-сниффинг и кеширование конфиденциальных документов.
use Yeeefang\TcpdfNext\Laravel\Http\PdfResponse;Инлайн-отображение
Отрендерите PDF напрямую во встроенном просмотрщике браузера с 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");
}Принудительная загрузка
Вызовите диалог сохранения файла браузера с 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");
}Заголовки безопасности
И inline(), и download() автоматически устанавливают следующие заголовки:
| Заголовок | Значение | Назначение |
|---|---|---|
Content-Type | application/pdf | Корректный MIME-тип |
Content-Disposition | inline или attachment | Режим отображения |
X-Content-Type-Options | nosniff | Предотвращение MIME-сниффинг атак |
Cache-Control | no-store, no-cache, must-revalidate | Предотвращение кеширования конфиденциальных PDF |
Content-Length | <количество байт> | Позволяет индикаторы прогресса загрузки |
Эти настройки по умолчанию следуют рекомендациям OWASP secure headers.
Потоковая передача больших PDF
Для документов, превышающих доступную память, передавайте порции напрямую в выходной буфер:
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() возвращает StreamedResponse с постоянным потреблением памяти независимо от размера документа.
Сигнатуры методов
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;Макросы ответов
Пакет регистрирует два макроса ответов для удобства:
return response()->pdf($pdf, 'report.pdf'); // download
return response()->pdfInline($pdf, 'report.pdf'); // inlineЭти макросы делегируют методам PdfResponse, поэтому все заголовки безопасности применяются.
Санитизация имён файлов
PdfResponse санитизирует имя файла для предотвращения инъекции заголовков. Символы вне [a-zA-Z0-9._-] удаляются и расширение .pdf обеспечивается принудительно:
// Input: "../../etc/passwd" -> Sanitized: "etcpasswd.pdf"
return PdfResponse::download($pdf, $userInput);Далее
- Facade Pdf — Создание документов и тестирование
- Задания очереди — Вынос тяжёлых PDF на фоновые воркеры
- Конфигурация — Настройка заголовков и поведения по умолчанию