Классическая проблема - Нет простого решения
Это классическая проблема. Это влияет на множество различных инструментов, а не только на dompdf. Есть как минимум три проблемы:
Инструмент на стороне сервера может работать с сгенерированным HTML, но не обычно запускает Javascript. Он интерпретирует HTML и CSS, как если бы это был браузер с отключенным Javascript, и поэтому jQuery и множество других библиотек Javascript просто не работают, поэтому любую графику, созданную на стороне клиента, невозможно захватить.
Клиентский инструмент может запускаться после завершения всего Javascript (jQuery или иным образом). Однако есть и другие проблемы ...
Существует несколько способов визуализации графики в браузере. Старомодным способом является создание графики на сервере и загрузка изображений jpg или png в браузер. Однако это не обеспечивает динамические диаграммы (в любом случае это не легко), подробные действия при наведении курсора и т. Д. Поэтому большинство сайтов теперь используют SVG или другую систему на стороне клиента. SVG поддерживается всеми (или почти всеми) современными браузерами, поэтому он в значительной степени заменил старые методы. SVG (а также более старые методы) НЕ легко записать для рендеринга в PDF или другой документ. В результате, даже в клиентских системах вы, как правило, будете иметь «дыры» в графике.
При создании SVG-диаграммы на стороне клиента размер определяется в зависимости от разрешения экрана. Если вам удастся захватить эту диаграмму вместе с HTML, текст будет иметь высокое разрешение (потому что это текст и может рассматриваться как текст в PDF с масштабируемыми шрифтами), но графика будет ограничена разрешением, как было изначально нарисовано. Это хорошо для случайного использования, но может не обеспечивать нужного или желаемого качества при печати на высококачественном принтере. Типичное разрешение экрана составляет ~ 100 точек на дюйм, типичное разрешение принтера составляет ~ 200 точек на дюйм - 300 точек на дюйм (номинальное значение намного выше, но с практической точки зрения цветные изображения, отображаемые с разрешением 200 точек на дюйм или более, обычно являются удовлетворительными, за исключением фотографий художественного качества).
Захват изображения виртуального браузера
Лучшее решение, которое я нашел на данный момент, - это использование виртуального или «безголового» браузера для создания всего - запуска Javascript и вывода SVG вместе с HTML и CSS. Затем запишите вывод в виде изображения с высоким разрешением, чтобы вставить его в свой PDF. Вы можете использовать любой серверный framework / toolkit / etc. чтобы сделать захват и создать PDF.
Доступны бесплатные пакеты с открытым исходным кодом. Вероятно, наиболее популярным является PhantomJS , но я только что проверил, и в настоящее время он заархивирован / не активен. Я использовал его, и это сработало, но у меня было немало проблем.
Также доступны различные услуги. В настоящее время я использую URLBox.io . У меня нет личной заинтересованности в этом - просто очень довольный клиент. Он включает в себя опцию (в зависимости от типа подписки) для сохранения изображений в Amazon S3, или вы можете сделать снимок локально. Для меня наиболее важно то, что вы можете установить очень высокое разрешение, чтобы захваченные изображения действительно выглядели великолепно. Я использую его в первую очередь для автоматической вставки изображений веб-страниц в PDF-файлы.