dompdf utf encoding and other abrakadabra при сохранении PDF из PHP + dompdf

Потребовалось сохранить информацию при помощи PHP в PDF. Казалось бы, задача достаточно тривиальная - “всё давно поделано до нас” (с). Более того, ранее написанная статья о создании PDF из PHP вдохновляла - щас “раз и всё”. Ан-нет.. Несколько дней (с перерывами) на одном месте протоптался.

Потребовалось сохранить уже готовую табличку из HTML в PDF. “Сейчас быстренько возьму готовую библиотечку и сделаю” (Картинка “нельзя так просто взять и сделать”). Dompdf был быстро скачан “вручную” (без использования композера), Выдавал HTML. но с вопросиками. Статьи “как добавлять свой utf-8 шрифт” (при помощи load_font.php ), генерация шрифтов при помощи ttf2ufm.exe (под windows), использование DeJaVu Sans в сочетании с
define("DOMPDF_UNICODE_ENABLED", true);

И, когда, казалось бы, конец уж близок.. (с)

Несколько дней (с перерывами) бился над абсолютно непонятной проблемой - dompdf ошибка 500 error

PHP Catchable fatal error: Argument 1 passed to Dompdf\\FrameDecorator\\AbstractFrameDecorator::copy() must be an instance of DOMNode, boolean given, called in /dompdf/src/FrameDecorator/Text.php on line 156 and defined in dompdf/src/FrameDecorator/AbstractFrameDecorator.php on line 133

Методом ненаучного тыка выяснил, что проблема проявляется при наличии длинного неразрывного текста в ячейке таблицы (как выяснится в последствии, это не обязательно должна быть таблица). Если принудительно “разбить” текст тэгами BR - всё работает корректно. Google по запросам dompdf long cell text, dompdf crashes table, page breaks inside table cells ничего дельного не выдал.

dompdf utf8 incorrect width word wrapЭксперименты натолкнули на мысль - искусственно ограничить ширину таблицы - результат аналогичный (более того, при указании ширины ячейки меньше, чем необходимо для вывода - вновь 500 ERROR and boolean given). Эксперименты с white-space, word-break и word-wrap резульат не дали. Что ж.. раз глючат таблицы - вложим текст в DIV.. и тут… выяснилось, что даже при указании ширины текст “уползает” за границы блока (border:solid 1px black;overflow:hidden;)

dompdf utf 8 incorrect width - была мысль, что некорректно определяется длина текста из-за неверно указанной ширины русских букв в файле шрифта. Потому как width of english text was correct.

В общем, решение оказалось совсем не там, где я его искал. Просмотр FrameReflower/TableCell.. В общем, на переносы текст “разбивается” в PHP с использованием регулярного выражения, а кодировка задаётся при помощи mb_internal_encoding. Указание же константы не привело к вызову - вся проблема решилась добавлением одной строчки в начало файла генерации PHP -
mb_internal_encoding('UTF-8');

Метки: ,

Автор будет признателен, если Вы поделитесь ссылкой на статью, которая Вам помогла:
BB-код (для вставки на форум)

html-код (для вставки в ЖЖ, WP, blogger и на страницы сайта)

ссылка (для отправки по почте)

1 комментарий к записи “dompdf utf encoding and other abrakadabra при сохранении PDF из PHP + dompdf”

  1. Семен сообщает :

    спасибо. два дня убил на эту штуку. ползут и ползут буквы.
    спасибо!!!!!!!!11

Добавить комментарий