# 《WaLiOffice - AI Agent 智能办公平台》第4-2节:附件处理与状态管理

作者:小傅哥
博客:https://bugstack.cn (opens new window)

沉淀、分享、成长,让自己和他人都能有所收获!😄

# 一、前言

大家好,我是技术UP主小傅哥。

上一节我们搞定了配置管理,这节来解决一个非常实际的问题 —— 用户上传了文件,怎么提取内容?

场景是这样的:用户上传一个 Word 文档,想让 AI 帮他总结;上传一个 Excel,想让 AI 分析数据;上传一个 PPT,想让 AI 理解里面的内容。所有这些,都需要先把文件内容读出来,才能喂给 LLM。

而且这里有两个消费方,需求完全不同:

  • LLM 要的是"文字" ——不管排版,把内容拼成纯文本塞进上下文
  • 前端要的是"结构" ——段落、表格、幻灯片、工作表,才能渲染出漂亮的富预览

所以 WaLiOffice 的文件提取模块是一套解析、两种输出。这节我们就来搞定它。

# 一、本章诉求

  1. 理解 Office 文件的本质:Word/Excel/PPT 本质上都是 ZIP + XML,搞清楚这个就不怕了
  2. 掌握 ZIP/XML 解析:用 Rust 的 zip crate + 正则提取 Office 文件内容
  3. 实现结构化提取:不只提取文字,而是提取"段落/表格/幻灯片/工作表"的结构,让前端能渲染富预览
  4. 支持 PDF 提取:用系统命令 pdftotext 提取 PDF 文字,命令不存在时兜底
  5. 截断保护:超大文档不能撑爆 LLM 上下文窗口

# 二、技术背景:Office 文件是什么

# 2.1 你以为的 Word vs 实际的 Word

很多人觉得 Word 文件就是"文字",但它实际上是一个 ZIP 压缩包:

example.docx  (其实是个 zip 文件)
└── [Content_Types].xml     ← 文件清单
└── _rels/
└── word/
    ├── document.xml        ← 真正的文档内容(XML 格式)
    ├── styles.xml          ← 样式定义
    └── theme/
└── docProps/
1
2
3
4
5
6
7
8

Excel(.xlsx)和 PowerPoint(.pptx)也是同样的结构,只是 XML 路径不同:

格式 内容 XML 文本标签
.docx word/document.xml <w:t>
.xlsx xl/worksheets/sheetN.xml + xl/sharedStrings.xml <v> / <t>
.pptx ppt/slides/slideN.xml <a:t>

理解了这一点,处理思路就清晰了——解压 → 读 XML → 解析内容。三种格式是同一套打法的三个变体。