TCPDF - плохая визуализация SVG-файлов при использовании setRasterizeVectorImages (true) - PullRequest
0 голосов
/ 30 января 2020

TCPDF изначально не предлагает полной поддержки файлов SVG, однако их рекомендация заключается в том, чтобы использовать Imagick в качестве обходного пути.

В соответствии с рекомендациями по документации вам необходимо:

  • Установить Imagick на вашем сервере (библиотека + PHP расширение)
  • Set $pdf->setRasterizeVectorImages(true);
  • Call $pdf->ImageSVG();

Я выполнил эти шаги и получил сообщение об ошибке :

ОШИБКА TCPDF: [Изображение] Невозможно получить изображение: / var / www/..../img_Bwl4tC

После исследования я обнаружил три проблемы:

  • Кажется, когда вызывается setRasterizeVectorImages(true), вы больше не можете использовать относительный путь с ImageSVG (), вместо этого вы должны указать веб-URL. Я заменил вызов функции cURL_ * на простой file_get_contents(), и он сработал.

  • В функции TCPDF Image () есть ошибка, которая неправильно возвращает ширину и высоту изображений SVG.

  • Несмотря на то, что говорится в документации, если вы используете setRasterizeVectorImages(true), вы должны вручную установить ширину и высоту SVG при вызове ImageSVG

Я исправил это, выполнив следующее:

$svgXML = simplexml_load_file($file);
list($originX, $originY, $relWidth, $relHeight) = explode(' ', $svgXML['viewBox']);
$imsize = isset($relWidth) ? [$relWidth, $relHeight] : false;

Теперь все работает, но изображение по-прежнему дрянное.

Без setRasterizeVectorImages() SVG является неполным :

Without setRasterizeVectorImages

При $pdf->setRasterizeVectorImages(true) рендеринг SVG ужасно :

[With setRasterizeVectorImages[3]

с Chrome (например, что я должен получить в TCPDF), все выглядит хорошо :

With Chrome

Есть идеи? Я бы хотел избежать переписывания всего скрипта с использованием mPDF.

...