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](https://i.stack.imgur.com/VtsuG.png)
При $pdf->setRasterizeVectorImages(true)
рендеринг SVG ужасно :
[![With setRasterizeVectorImages[3]](https://i.stack.imgur.com/zMN3Z.png)
с Chrome (например, что я должен получить в TCPDF), все выглядит хорошо :
![With Chrome](https://i.stack.imgur.com/ghZWh.png)
Есть идеи? Я бы хотел избежать переписывания всего скрипта с использованием mPDF.