TcpdF本身不提供对SVG文件的全面支持,但是建议使用Imagick作为解决方法。
根据他们的文档建议,您必须:
- 在您的服务器上安装Imagick(库+ PHP扩展)
- 设置
$pdf->setRasterizeVectorImages(true);
- 致电
$pdf->ImageSVG();
我按照以下步骤操作,并收到一条错误消息:
TcpdF错误:[图像]无法获取图像:/ var / www /..../ img_Bwl4tC
调查后,我发现了三个问题:
-
似乎在调用
setRasterizeVectorImages(true)
时,您不再可以在ImageSVG()中使用相对路径,而必须提供一个Web URL。我用一个简单的file_get_contents()
替换了对cURL_ *函数的调用,并且可以正常工作。 -
TcpdF Image()函数中有一个错误,该错误无法正确检索SVG图像的宽度和高度。
-
尽管文档在说什么,但如果您使用
时手动设置SVG的宽度和高度。setRasterizeVectorImages(true)
,则必须在调用ImageSVG
我通过以下操作对其进行了修复:
$svgXML = simplexml_load_file($file);
list($originX,$originY,$relWidth,$relHeight) = explode(' ',$svgXML['viewBox']);
$imsize = isset($relWidth) ? [$relWidth,$relHeight] : false;
现在一切正常,但是图像仍然很糟糕。
没有setRasterizeVectorImages()
时,SVG为不完整:
使用$pdf->setRasterizeVectorImages(true)
,SVG渲染糟糕:
[
使用Chrome浏览器(例如,我应该从TcpdF中获得的东西),一切看起来都很好:
有什么主意吗?我想避免使用mPDF重写整个脚本。