web-to-ppt → PPT 映射分析
1. JSON 结构总览
顶层字段
| 字段 |
说明 |
canvas |
画布尺寸 {width, height, x, y, backgroundColor} |
nodes |
根节点树(type=FRAME, name=html) |
assets |
图片资源 {key: base64} |
fonts |
字体列表 |
schemaVersion |
JSON 版本号 |
节点类型
| 类型 |
数量 |
说明 |
| FRAME |
471 |
HTML 容器(div, section, table, header 等) |
| TEXT |
393 |
文字节点 |
| RECTANGLE |
10 |
截图底图(comparison layer,用于视觉对比) |
节点属性
2. 57个 styles 字段分类
已处理(15个)
| 字段 |
用途 |
当前处理方式 |
| backgroundColor |
背景色 |
→ shape fill |
| backgroundImage |
渐变背景 |
→ 提取起始色做纯色 fill |
| borderTopWidth/Color/Style |
顶部边框 |
→ shape line(四边都有时)或单独线条 |
| borderBottomWidth/Color/Style |
底部边框 |
同上 |
| borderLeftWidth/Color/Style |
左边框 |
同上 |
| borderRightWidth/Color/Style |
右边框 |
同上 |
| borderTopLeftRadius |
圆角 |
→ rectRadius |
| boxShadow |
阴影 |
→ shadow |
| fontSize |
字号 |
→ fontSize(pt) |
| fontFamily |
字体 |
→ fontFace |
| color |
文字颜色 |
→ color |
| fontWeight |
粗体 |
→ bold |
| fontStyle |
斜体 |
→ italic |
| textAlign |
对齐 |
→ align |
未处理(42个)
| 字段 |
重要性 |
说明 |
| opacity |
高 |
元素透明度,PPT支持 opacity |
| lineHeight |
高 |
行高,影响文字换行和间距 |
| letterSpacing |
中 |
字间距,PPT支持 charSpacing |
| textDecorationLine |
中 |
下划线/删除线 |
| textTransform |
低 |
大小写转换 |
| whiteSpace |
高 |
控制换行行为(nowrap等) |
| wordBreak |
中 |
断词规则 |
| visibility |
中 |
visible/hidden |
| display |
中 |
none时不渲染 |
| transform |
中 |
旋转/缩放/位移 |
| transformOrigin |
低 |
变换原点 |
| zIndex |
高 |
层级顺序 |
| overflow |
中 |
溢出处理 |
| clipPath |
低 |
裁剪路径 |
| filter |
低 |
CSS滤镜 |
| borderTopRightRadius |
中 |
右上圆角(目前只用左上) |
| borderBottomLeftRadius |
中 |
左下圆角 |
| borderBottomRightRadius |
中 |
右下圆角 |
| backgroundPosition |
低 |
背景定位 |
| backgroundSize |
低 |
背景尺寸 |
| backgroundRepeat |
低 |
背景重复 |
| backgroundClip |
低 |
背景裁剪 |
| backgroundOrigin |
低 |
背景原点 |
| position |
低 |
定位方式 |
| objectFit |
低 |
图片适配 |
| objectPosition |
低 |
图片定位 |
| maskImage/MaskPosition/MaskSize |
低 |
遮罩 |
| webkitMaskImage/MaskPosition/MaskSize |
低 |
遮罩(webkit) |
| backdropFilter |
低 |
背景滤镜 |
3. 映射优先级
P0(必须处理)
- opacity → shape/text 的 opacity 属性
- whiteSpace → 控制文字是否换行
- zIndex → 调整 objects 数组顺序(后渲染在上层)
- lineHeight → 文字行高(paraSpaceBefore/after 或 lineSpacingMultiple)
P1(应该处理)
- letterSpacing → charSpacing(字符间距)
- textDecorationLine → underline/strike
- display:none → 跳过该节点
- visibility:hidden → 跳过该节点
- 四个圆角独立处理 → 当前只用了 borderTopLeftRadius
P2(可以处理)
- transform → rotate 属性
- wordBreak → 辅助判断换行
- overflow → 辅助判断裁剪
- filter → 特殊效果(大部分PPT不支持)
4. 当前代码架构
convert-w2p.js 处理流程
- findSlides() — 找 page/slide-N 容器
- collectSlideChildren() — 递归提取子节点(保留层级)
- collectOrphans() — 收集游离节点归入最近 slide
- 排序:FRAME 在前,TEXT 在后
- 映射循环:遍历每个子节点
- TEXT → text 对象(含字号/字体/颜色/粗体/对齐)
- IMAGE → image 对象
- FRAME with bg → shape 对象(含 fill/border/shadow/rectRadius)
- 四边 border → 独立线条 shape
- 输出 Schema JSON + 调用 pptxgenjs 生成 PPTX
5. 下一步行动
短期(本次迭代)
中期
长期