PDF: документы из HTML
Договор, акт, бланк, счёт. Разметка на входе, PDF на выходе; движок — dompdf, он входит в состав компонента.
Таблицы и миграции у этого слоя нет: документ собирается на лету, а где его хранить — дело вызывающего кода.
Как напечатать
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_paper | A4 | размер листа |
pageblocks_pdf_font | DejaVu 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']). - Слияния и подписи. Ни склейки нескольких документов, ни ЭЦП.