PHP解析Pixso JSON失败因BOM头,需ltrim($json, "\xEF\xBB\xBF")清洗;SVG坐标错位因画布Y轴向下,应依viewBox缩放;读PNG需mb_convert_encoding+rawurlencode防编码错误;导入DSL须严格匹配schema,id需唯一且合法。

PHP读取Pixso导出的JSON文件时解析失败
Pixso导出的设计稿元数据(如图层结构、样式)默认是UTF-8编码的JSON,但部分版本会在文件开头插入BOM头(\xEF\xBB\xBF),导致json_decode()返回null且json_last_error()报JSON_ERROR_UTF8。
解决方法不是强行忽略错误,而是预处理清洗:
- 用
file_get_contents()读取原始内容后,先用ltrim($json, "\xEF\xBB\xBF")移除BOM - 再传给
json_decode($cleaned_json, true),避免因不可见字符中断解析 - 若需兼容Windows记事本等乱加BOM的场景,可扩展为
preg_replace('/^\s+/', '', $json),但注意别误删合法空白
Pixso导出的SVG路径坐标与PHP图像处理错位
Pixso导出的.svg文件中<path d="...">使用的是设计稿画布坐标系(Y轴向下),而GD或Imagick在叠加渲染时若直接套用,会导致元素整体上移或翻转。
关键不在转换算法,而在识别Pixso是否启用了「导出时适配视口」:
立即学习“PHP免费学习笔记(深入)”;
- 检查导出SVG的
<svg>根节点是否有viewBox属性;有则说明已做归一化,PHP端应优先按viewBox缩放,而非硬编码宽高 - 若无
viewBox,且width/height为具体像素值(如width="1920" height="1080"),需确认PHP绘图目标尺寸是否一致,否则用imagecopyresampled()缩放前先校准比例 - 路径字符串本身无需反转Y坐标——那是渲染引擎的事;PHP只需确保SVG作为资源加载时未被GD强制重采样失真
用PHP批量处理Pixso导出的PNG切图并保留命名语义
Pixso支持按图层名导出PNG(如btn-primary@2x.png),但导出ZIP解压后文件名可能含空格、中文或特殊符号,直接file_get_contents()会失败。
重点不是重命名,而是安全读取:
- 用
mb_convert_encoding($filename, 'UTF-8', 'auto')统一编码,再rawurlencode()转义后拼接路径 - 避免用
glob("*.png")遍历——它不保证编码安全;改用scandir()+mb_ereg_match()匹配/.+\.png$/u - 若需提取
@2x倍率信息,正则用/^(.+?)(?:@(\d+x))?\.(png|jpg)$/u,注意?要非贪婪,否则icon@2x@3x.png会截断错误
PHP生成Pixso可导入的DSL JSON结构失败
Pixso不接受任意JSON格式导入,只认特定schema(如type: "frame"、children数组必须存在),且字段缺失或类型错(如把width写成字符串)会导致静默丢弃整个节点。
最简验证方式不是靠文档,而是反向提取:
- 在Pixso中建一个最简Frame → 导出JSON → 用
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)格式化对比结构 - 必填字段:每个节点至少含
type、name、visible、children(即使为空数组) -
props下fill必须是数组(哪怕单色),不能是字符串;fontSize必须是数字,不能带单位(如"14px"会失效)
真正卡住的往往不是语法,而是Pixso对id字段的隐式要求:必须全局唯一、长度适中(过长可能触发截断)、不含特殊字符。建议用spl_object_hash(new stdClass())生成临时ID,导入成功后再批量替换为业务ID。



















