vue-office-preview-lite
Version:
preview office file in vue , with out compile office lib
150 lines (117 loc) • 3.55 kB
Markdown
# Vue Office 文件预览组件
一个基于 Vue 2 的 Office 文件在线预览组件,支持 PDF、Word、Excel、PowerPoint 等常见办公文档的在线预览。
## 目标
`@vue-office`是一个非常方便的文件预览组件,但是依赖也很大,如果直接在项目中依赖,则增加了很多额外依赖,相对应带来的问题:
- 浏览器加载需要优化,如何分包,如何懒加载
- `webpack` 或 `vite` 需要配置对应的文件,相对会降低开发时的构建工具的处理速度
## 解决方案
采用 iframe 隔离方案:
1. 将 `@vue-office` 的代码编译到 iframe 中,打包到 `office-preview` 目录下
2. `vue` 组件通过 `iframe` 和 `office-preview` 下的代码交互
3. 使用 `copy-webpack-plugin` 或 `vite-plugin-static-copy` 实现开发时动态代理 `iframe`
## 架构设计
```mermaid
graph TD
A[Vue 主应用] -->|postMessage| B[iframe 容器]
B -->|加载| C[office-preview 应用]
C -->|文件类型判断| D[文件类型判断模块]
D -->|PDF| E[PDF 预览]
D -->|Word| F[Word 预览]
D -->|Excel| G[Excel 预览]
D -->|PPT| H[PPT 预览]
subgraph 主应用
A
end
subgraph 预览应用
B
C
D
E
F
G
H
end
```
### 核心模块说明
1. **主应用模块**
- Vue 组件封装
- iframe 通信管理
- 文件 URL 处理
2. **预览应用模块**
- 文件类型判断
- 预览组件加载
- 文件内容渲染
3. **通信模块**
- postMessage 消息处理
- 状态同步
- 错误处理
## 功能特点
- 📄 支持多种文件格式预览
- PDF 文件(.pdf)
- Word 文档(.doc, .docx)
- Excel 表格(.xls, .xlsx)
- PowerPoint 演示文稿(.ppt, .pptx)
- 🔍 智能文件类型识别
- 通过文件扩展名快速判断
- 通过文件内容(magic number)精确判断
- 支持新旧版 Office 文件格式
## 技术栈
- Vue 2
- TypeScript
- vue-office 系列组件
- @vue-office/pdf
- @vue-office/docx
- @vue-office/excel
- @vue-office/pptx
## 安装使用
1. 安装依赖
```bash
npm install vue-office-preview-lite
```
2. 引入组件
```vue
<template>
<file-preview :fileUrl="fileUrl" />
</template>
<script setup>
import FilePreview from 'vue-office-preview-lite'
</script>
```
## 组件属性
| 属性名 | 类型 | 必填 | 默认值 | 说明 |
|--------|--------|------|--------|----------------|
| fileUrl | String | 是 | - | 文件访问地址 |
| fileType | String | 否 | null | 文件类型,可选值:'pdf'、'word'、'excel'、'ppt' |
| frameUrl | String | 否 | ./office-preview/index.html | 预览 iframe 的地址 |
## 文件类型判断逻辑
1. 扩展名判断(快速)
- 通过文件 URL 后缀快速判断文件类型
- 支持常见文件扩展名
2. 内容判断(精确)
- PDF: `%PDF` 文件头
- DOCX/XLSX/PPTX: ZIP 文件头 + 内容类型判断
- 旧版 Office 文件: 复合文档格式判断
## 示例代码
```vue
<template>
<div class="preview-container">
<file-preview
:fileUrl="fileUrl"
:fileType="fileType"
frameUrl="./office-preview/index.html"
/>
</div>
</template>
<script setup>
import { ref } from 'vue'
import FilePreview from 'vue-office-preview-lite'
const fileUrl = ref('https://example.com/document.pdf')
const fileType = ref('pdf') // 可选,不传则自动判断
</script>
<style scoped>
.preview-container {
width: 100%;
height: 800px;
}
</style>
```