TCPDF 在使用图像数据 uri 传递 SVG 时产生错误
TCPDF producing errors when passing SVG using data uri for images
我在前端使用 FabricJS 来设计花押字,并裁剪上传到 canvas 的图像以适合设计。 Fabric 在生成 SVG 时使用源图像,所以我将图像源更新为数据 uri 并在最终调用 toSVG()
之前渲染 canvas
以上有效,需要调整,但正在生成 SVG,看起来不错。
现在,当我们将 SVG 数据传递给 TCPDF 时,TCPDF 会抛出错误并构建不完整的 PDF。除嵌入图像外的所有内容均已正确绘制。然而,图像部分只是一个白色方块。
是什么导致 TCPDF 无法解析 data-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
Link 到 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 技能达到要求,您可能可以修复并提交拉取请求。
与此同时,您可以通过 运行 通过 str_replace()
函数传入的 SVG 文件来解决此问题,将之前 stroke-dasharray: ;
的所有实例替换为 stroke-dasharray: none;
您将 SVG 数据传递给 TCPDF,这应该可以解决您的问题。
我在前端使用 FabricJS 来设计花押字,并裁剪上传到 canvas 的图像以适合设计。 Fabric 在生成 SVG 时使用源图像,所以我将图像源更新为数据 uri 并在最终调用 toSVG()
之前渲染 canvas以上有效,需要调整,但正在生成 SVG,看起来不错。
现在,当我们将 SVG 数据传递给 TCPDF 时,TCPDF 会抛出错误并构建不完整的 PDF。除嵌入图像外的所有内容均已正确绘制。然而,图像部分只是一个白色方块。
是什么导致 TCPDF 无法解析 data-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
Link 到 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 技能达到要求,您可能可以修复并提交拉取请求。
与此同时,您可以通过 运行 通过 str_replace()
函数传入的 SVG 文件来解决此问题,将之前 stroke-dasharray: ;
的所有实例替换为 stroke-dasharray: none;
您将 SVG 数据传递给 TCPDF,这应该可以解决您的问题。