PHP 处理 SVG

尺码表准备用 SVG 来生成,因为 SVG 本质上是 一个 xml 文件,方便我直接用代码来操作这个 xml 文件,在用 PHP 处理 xml 文件的时候(不用 Golang 的原因是没有找到相应的库),遇到几个问题,后来发现是自己没有仔细读官方的讨论,让我白忙活了 3 个小时。

20220608Qu5M1w

SimpleXMLElement

xml 命名空间的问题

如果 xml 文件有声明命名空间,这个库的 xpath 就会失效,我一直以为是我的代码问题,后来读到有人反馈相同的问题,才可以在 SimpleXMLElement 中使用 xpath。

PHP: SimpleXMLElement::xpath – Manual 这个文档里面的 User Contributed Notes 写的非常清晰,命名空间的问题,无法使用 xpath。

删除节点的问题

我的需求是要能删除某 xml 的某一个节点,然后再生成 xml 文档,删除的语法比较奇怪。

xml – Remove a child with a specific attribute, in SimpleXML for PHP – Stack Overflow

unset($doc->xpath('seg[@id="A12"]')[0]->{0});

SVG 转换成 PNG

通过 PHP 把 SVG 转换成 PNG

这个要安装 imagick 扩展,大概的代码如下。

        $im = new Imagick();        
        $svg = file_get_contents($link);        
        $im->setBackgroundColor(new ImagickPixel('transparent'));        
        $im->readImageBlob($svg);
        $im->setImageFormat("png32");        
        $im->writeImage($path.$file.".png");
        $im->clear();
        $im->destroy(); 

Issue in svg to png – ImageMagick

image – How to convert SVG to PNG using ImageMagick in PHP? – Stack Overflow

通过命令行直接转

brew install imagemagick --with-librsvg

convert    801.svg 801.png

convert -size 800x800   801.svg 801.png

发表评论