Skip to content

PDF: документы из HTML ​

Договор, акт, бланк, счёт. Разметка на входе, PDF на выходе; движок — dompdf, он входит в состав компонента.

Таблицы и миграции у этого слоя нет: документ собирается на лету, а где его хранить — дело вызывающего кода.

Как напечатать ​

php
use Boshnik\PageBlocks\Support\Pdf;

// Байтами — во вложение письма или в ответ браузеру.
$bytes = Pdf::view('file:docs/contract', ['order' => $order]);

// Файлом на диск.
$file = Pdf::write(MODX_ASSETS_PATH . 'docs/42.pdf', $html);

// Альбомом — накладной книжная ориентация не годится.
$bytes = Pdf::render($html, ['orientation' => 'landscape']);
МетодОтдаёт
available()есть ли движок
render($html, $options)байты PDF или null
view($tpl, $data, $options)то же из шаблона
write($path, $html, $options)путь, который получился на самом деле

$options: paper (A4, letter…), orientation (portrait / landscape), font.

Шаблон в view() разбирается тем же резолвером, что и view() вообще: имя — чанк из базы, file: — файл, file:<источник>: — именованный источник, @INLINE — шаблон строкой.

Почему write() возвращает путь, а не true ​

Без dompdf рядом ляжет .html, и звать его .pdf было бы враньём. Берите расширение у возвращённого пути, когда составляете имя для скачивания или для вложения.

Пустая разметка — отказ, а не пустой документ ​

render() и write() на пустой строке возвращают null и пишут в лог. Пустой документ — это сломанный шаблон; отдать чистый лист значит отдать его на подпись, и по белой странице уже не понять, что печатать было нечего.

Настройки ​

НастройкаПо умолчаниюЧто делает
pageblocks_pdf_paperA4размер листа
pageblocks_pdf_fontDejaVu Sansшрифт по умолчанию

Имя шрифта, которого движок не знает, молча вернёт латиницу — менять есть смысл только под свой встроенный шрифт.

Шрифт по умолчанию — не украшение

Со встроенным Helvetica русский счёт уходит подписанту строкой из вопросительных знаков, и замечает это бухгалтерия, а не разработчик. DejaVu идёт в комплекте с dompdf и покрывает кириллицу и румынские диакритики.

Ориентация — параметром, а не настройкой

Её выбирает документ, а не площадка: счёт книжный, накладная альбомная. Общая настройка перевернула бы оба. Размер листа, наоборот, настройка: он про страну, а не про документ.

Что решено за вас ​

Внешние адреса не загружаются ​

Загрузка по сети выключена и наружу не выведена. Документ часто собирается из того, что ввёл посетитель, а включённый флаг превращает <img src="http://10.0.0.1/..."> в запрос, который делает сервер.

Цена названа прямо

Картинка по внешнему адресу в документ не попадёт. Логотип в счёте надо класть файлом и ссылаться путём на диске.

Чтение файлов заперто внутри сайта ​

Корень чтения — MODX_BASE_PATH. Без этого путь в разметке адресует весь диск, и шаблон, в который попала чужая строка, читает что угодно.

Чего пока нет ​

  • Колонтитулов и нумерации страниц. dompdf умеет их через @page и $PAGE_NUM, но обёртки нет.
  • Ответа в браузер одной строкой. Response::download() принимает путь, поэтому поток отдаётся через уже записанный файл. Байтами — руками: response($bytes, 200, ['Content-Type' => 'application/pdf']).
  • Слияния и подписи. Ни склейки нескольких документов, ни ЭЦП.

© PageBlocks 2019-present