TCPDF在使用图像的数据uri传递SVG时产生错误


TCPDF producing errors when passing SVG using data uri for images

我在前端使用FabricJS来设计花押字,上传到画布的图像会被裁剪以适应设计。Fabric在生成SVG时使用源图像,因此在最终调用toSVG()之前,我将图像源更新为数据uri并渲染画布

上面的工作原理需要调整,但是SVG正在生成中,看起来不错。

现在,当我们将SVG数据传递给TCPDF时,TCPDF会抛出错误并构建不完整的PDF。除了嵌入的图像外,其他所有内容都绘制正确。然而,图像部分只是一个白色的正方形。

是什么原因导致TCPDF无法解析数据uri图像?

Warning: Illegal string offset 'masked' in /home/xxx/includes/tcpdf/tcpdf.php on line 7145
Warning: Illegal string offset 'altimgs' in /home/xxx/includes/tcpdf/tcpdf.php on line 7151
Warning: Illegal string offset 'i' in /home/xxx/includes/tcpdf/tcpdf.php on line 20877
Warning: Illegal string offset 'i' in /home/xxx/includes/tcpdf/tcpdf.php on line 20890
Warning: Illegal string offset 'i' in /home/xxx/includes/tcpdf/tcpdf.php on line 7153
Warning: Illegal string offset 'i' in /home/xxx/includes/tcpdf/tcpdf.php on line 7188
Warning: Illegal string offset 'i' in /home/xxx/includes/tcpdf/tcpdf.php on line 7235

SVG数据链接:http://pastebin.com/SqjYT89Q

我认为这个问题是由FabricJS中的一个错误引起的。使用FabricJS生成的SVG文件在path标记的stroke属性中使用了许多stroke-dasharray参数实例,但它没有包含任何选项规范,根据SVG规范,这是错误的:

http://www.w3.org/TR/SVG/painting.html#StrokeProperties

该文件包含许多如下所示的实例:

style="stroke: none; stroke-width: 1; stroke-dasharray: ; stroke-linecap: butt;...

但实际上应该是这样的:

style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt;...

请注意在stroke-dasharray之后添加了none选项。

为了测试这一理论,我对您提供的SVG文件进行了简单的搜索和替换,添加了none选项,完成后,我就可以使用Imagick成功地将您的SVG文件转换为JPG(获得了带有URL和漂亮狗的图片的紫色椭圆形。:-)。基于这个结果,我非常有信心,如果SVG文件中的这个问题得到解决,TCPDF错误就会消失。

这个问题的正确解决方案是在GitHub上的FabricJS项目中提出一个问题,如果你的JavaScript技能能够胜任,你可能会进行修复并提交一个pull请求。

同时,您可以通过str_replace()函数运行传入的SVG文件来解决这个问题,在将SVG数据传递到TCPDF之前,用stroke-dasharray: none;替换stroke-dasharray: ;的所有实例,这应该可以解决您的问题。