【前端】ikun-pptx编辑器前瞻问题二: pptx的压缩包结构,以及xml正文树及对应元素介绍

文章目录

PPTX文件本质:一个压缩包

PPTX文件实际上是一个遵循Open XML标准的ZIP压缩包,包含多个XML文件和其他资源。我们可以通过解压工具查看其内部结构:

复制代码
pptx文件
├── [Content_Types].xml
├── _rels/
├── docProps/
│   ├── app.xml
│   ├── core.xml
│   └── thumbnail.jpeg
└── ppt/
    ├── presentation.xml
    ├── slides/
    │   ├── slide1.xml
    │   ├── slide2.xml
    │   └── ...
    ├── slideLayouts/
    ├── slideMasters/
    ├── media/          # 存放图片等媒体资源
    ├── theme/
    └── _rels/

可以看到,每一页幻灯片是一个独立的xml文件

而图片,可能以链接

核心文件解析

1. 幻灯片内容文件 (ppt/slides/slideX.xml)

每个幻灯片对应一个XML文件,包含以下关键结构:

xml 复制代码
<p:sld>
  <p:cSld>       <!-- 幻灯片画布 -->
    <p:spTree>   <!-- 形状树 -->
      <p:sp>     <!-- 形状/文本框 -->
        <p:nvSpPr>  <!-- 非可视属性 -->
        <p:spPr>    <!-- 形状属性 -->
        <p:txBody>  <!-- 文本内容 -->
      </p:sp>
      <p:pic>    <!-- 图片元素 -->
        <p:nvPicPr>
        <p:blipFill>  <!-- 图片填充 -->
        <p:spPr>
      </p:pic>
    </p:spTree>
  </p:cSld>
</p:sld>

2. 元素类型解析

文本框元素 (p:sp)
xml 复制代码
<p:sp>
  <p:nvSpPr>
    <p:cNvPr id="1" name="TextBox 1"/>
    <p:cNvSpPr/>
  </p:nvSpPr>
  <p:spPr>  <!-- 样式属性 -->
    <a:xfrm>  <!-- 位置/尺寸 -->
      <a:off x="1524000" y="1524000"/>
      <a:ext cx="2743200" cy="914400"/>
    </a:xfrm>
    <a:prstGeom prst="rect">  <!-- 预设形状 -->
      <a:avLst/>
    </a:prstGeom>
  </p:spPr>
  <p:txBody>  <!-- 文本内容 -->
    <a:bodyPr/>
    <a:p>      <!-- 段落 -->
      <a:r>    <!-- 文本运行 -->
        <a:rPr lang="zh-CN" sz="1800"/>  <!-- 文本属性 -->
        <a:t>Hello World</a:t>  <!-- 文本内容 -->
      </a:r>
    </a:p>
  </p:txBody>
</p:sp>
图片元素 (p:pic)
xml 复制代码
<p:pic>
  <p:nvPicPr>
    <p:cNvPr id="2" name="Picture 1"/>
    <p:cNvPicPr>
      <a:picLocks noChangeAspect="1"/>
    </p:cNvPicPr>
  </p:nvPicPr>
  <p:blipFill>  <!-- 图片填充 -->
    <a:blip r:embed="rId1"/>  <!-- 引用关系ID -->
    <a:stretch>
      <a:fillRect/>
    </a:stretch>
  </p:blipFill>
  <p:spPr>  <!-- 样式属性 -->
    <a:xfrm>
      <a:off x="1524000" y="1524000"/>
      <a:ext cx="2743200" cy="1828800"/>
    </a:xfrm>
    <a:prstGeom prst="rect">
      <a:avLst/>
    </a:prstGeom>
  </p:spPr>
</p:pic>

单位系统

PPTX中使用EMU(English Metric Unit)作为基本单位:

  • 1英寸 = 914400 EMU
  • 1厘米 = 360000 EMU
  • 1磅 = 12700 EMU

转换公式:

javascript 复制代码
function emuToPx(emu, dpi = 96) {
  return Math.round((emu / 914400) * dpi);
}

开发注意事项

  1. 关系映射 :所有资源引用都通过 ppt/_rels目录下的关系文件映射
  2. 媒体资源 :图片存储在 ppt/media目录,通过 r:embed引用
  3. 样式继承:幻灯片会继承slideMaster和slideLayout中的样式
  4. 命名空间:XML中使用大量命名空间前缀,解析时需注意

参考工具

  1. Open XML SDK
  2. PPTX.js
  3. Office XML文档

下期预告:如何在前端实现PPTX的页面元素解析与渲染

pptx渲染路线图

在此,我们简单确定一个渲染路线图, 后续按照此顺序对 每一页的元素完成解析并进行还原度评估

相关推荐
迅猛龙办公室2 小时前
Python输出当前计算机的系统日期和时间
开发语言·前端·python
小狼154542 小时前
浏览器扩展脚本为什么有时候不生效:注入时机、iframe 和单页路由,多多开票助手
前端·chrome
じòぴé南冸じょうげん3 小时前
油猴脚本突然发现变成灰色了,无法使用?页面不生效?刷新页面没反应?
前端
Csvn4 小时前
组合式 API(Composition API)
前端
火柴就是我6 小时前
Android 打包报错 25.0.3
android·前端
BD_Marathon6 小时前
消息对象中字段的说明
java·前端·python
八荒启·交互动画6 小时前
Web特效025—用 Canvas 2D 做Web特效的定义与边界:这支画笔能做到哪一步
前端·webgl·网页特效·八荒启-交互动画·八荒启
Ai-_Man6 小时前
您您这可以把Dola的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。用AI导出鸭,答案是可以的
开发语言·前端·人工智能·小程序
excel6 小时前
Nuxt 中使用 useHead 优化 SEO 与 GEO
前端
IT_陈寒7 小时前
SpringBoot启动慢得像蜗牛?原来是这个配置在捣鬼
前端·人工智能·后端