Skip to content

HTTP-ответы

Класс PdfResponse предоставляет безопасные, соответствующие стандартам хелперы HTTP-ответов для доставки PDF в браузер. Он автоматически устанавливает все необходимые заголовки, включая заголовки безопасности, предотвращающие MIME-сниффинг и кеширование конфиденциальных документов.

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

Инлайн-отображение

Отрендерите PDF напрямую во встроенном просмотрщике браузера с 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");
}

Принудительная загрузка

Вызовите диалог сохранения файла браузера с 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");
}

Заголовки безопасности

И inline(), и download() автоматически устанавливают следующие заголовки:

ЗаголовокЗначениеНазначение
Content-Typeapplication/pdfКорректный MIME-тип
Content-Dispositioninline или attachmentРежим отображения
X-Content-Type-OptionsnosniffПредотвращение MIME-сниффинг атак
Cache-Controlno-store, no-cache, must-revalidateПредотвращение кеширования конфиденциальных PDF
Content-Length<количество байт>Позволяет индикаторы прогресса загрузки

Эти настройки по умолчанию следуют рекомендациям OWASP secure headers.

Потоковая передача больших PDF

Для документов, превышающих доступную память, передавайте порции напрямую в выходной буфер:

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() возвращает StreamedResponse с постоянным потреблением памяти независимо от размера документа.

Сигнатуры методов

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;

Макросы ответов

Пакет регистрирует два макроса ответов для удобства:

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

Эти макросы делегируют методам PdfResponse, поэтому все заголовки безопасности применяются.

Санитизация имён файлов

PdfResponse санитизирует имя файла для предотвращения инъекции заголовков. Символы вне [a-zA-Z0-9._-] удаляются и расширение .pdf обеспечивается принудительно:

php
// Input: "../../etc/passwd"  ->  Sanitized: "etcpasswd.pdf"
return PdfResponse::download($pdf, $userInput);

Далее

Распространяется по лицензии LGPL-3.0-or-later.