# document
**Repository Path**: marklang/document
## Basic Information
- **Project Name**: document
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: AGPL-3.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-09-24
- **Last Updated**: 2026-09-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 在线文档编辑器
English |
简体中文 |
日本語 |
한국어 |
Deutsch |
Español |
Português |
فارسی
在浏览器标签页里打开和编辑 Word、Excel、PPT 文件。没有服务器:OnlyOffice 引擎和它的
WASM 转换器都跑在访问者自己的设备上,文档不会被上传,也不需要注册账号。
**线上地址:[edit.chaxus.com](https://edit.chaxus.com/)**
---
## ✨ 主要特性
- 🔒 **不上传任何文件** — 转换、编辑、导出全部发生在这个标签页里
- 📝 **是编辑,不是预览** — DOCX、XLSX、PPTX、CSV,另支持 ODF、RTF、TXT 与旧版二进制格式;PDF 可打开并批注
- 💾 **直接存回你自己的文件** — 选一次文件,之后每次保存都写回它(Chromium 系;其它浏览器仍是下载)
- 🕓 **误关标签页也不会丢** — 编辑内容自动保存进你自己的浏览器,保留 7 天,随时可手动删除([说明](#-数据只留在你的设备上))
- 📴 **可离线使用** — 可安装为 PWA,首次访问之后无需联网
- 🌍 **多语言** — 站点界面 8 种语言,编辑器界面 45 种
- 🧩 **可嵌入** — 完整的 iframe postMessage API
- 🤖 **面向 Agent** — 提供 WebMCP 工具,浏览器内的 AI Agent 可直接打开、转换、读取文档
- 🚀 **随处部署** — 纯静态产物,放在任意 Web 服务器后面即可
---
## 🚀 快速开始
**直接使用:**[edit.chaxus.com](https://edit.chaxus.com/),无需安装。
**用 Docker 自建:**
```bash
docker run -d --name document -p 8080:80 ghcr.io/ranuts/document:latest
```
**从源码运行:**
```bash
git clone https://github.com/ranuts/document.git
cd document
pnpm install
pnpm run dev
```
---
## 📄 支持的格式
| 类型 | 可编辑 | 也能打开 |
| ---- | ---------------- | --------------------------- |
| 文档 | `.docx` | `.doc` `.odt` `.rtf` `.txt` |
| 表格 | `.xlsx` `.csv` | `.xls` `.ods` |
| 演示 | `.pptx` | `.ppt` `.odp` |
| PDF | 批注、填写、导出 | `.pdf` |
以上都可以导出为 PDF。CSV 存回时保持原编码(打开时会依次嗅探 UTF-8、GB18030、Latin-1)。
---
## 🔗 路由与 URL 参数
| 路由 | 说明 |
| --------------------- | ---------------------------------------- |
| `/` | 落地页。不打开文档就不会加载编辑器代码。 |
| `/editor` | 编辑器。 |
| `/history` | 本机浏览器当前保存的文档(见下)。 |
| `/help`、`/changelog` | 由 `content/` 下的 markdown 生成。 |
`/editor` 的参数:
| 参数 | 说明 |
| -------------- | ------------------------------------------------------------------------ |
| `src=` | 从 URL 打开文档(该 URL 需允许 CORS) |
| `file=` | 同上,旧写法;两者同时存在时以它为准 |
| `new=docx` | 新建空白文档(`docx`、`xlsx`、`pptx`) |
| `saved=` | 打开本机保存的某一篇——编辑器会把自己的 id 写在这里,因此刷新会回到同一篇 |
| `readonly=1` | 只读打开:禁用编辑与导出 |
| `embed=1` | 嵌入模式,由宿主页面通过 postMessage 驱动 |
| `locale=zh-CN` | 界面语言 |
---
## 🔐 数据只留在你的设备上
文档不会被发送到任何地方。在浏览器支持的情况下,保存会直接写回你选定的那个文件,
文档因此留在你自己的文件系统里,而不是下载目录里。浏览器本身还会保留两样东西,
且都可以由你删除:
- **你编辑过的文档副本**:编辑过程中,编辑器会把文档保存进这个浏览器(IndexedDB),
刷新、误关标签页、浏览器崩溃都不会让工作白做,重新打开编辑器会提示你接着编辑。
这些副本是为了让你接着做没做完的事,不是备份——想长期保留请导出到电脑。
- **七天后自动删除**:每篇文档在你最后一次编辑或打开的七天后自动删除,不需要你做任何事。
[`/history`](https://edit.chaxus.com/history) 列出当前保存了哪些文档,每一行都能删除,
也可以一次全部删除,还能直接关掉自动保存。在那里删除立即生效。共用电脑上,先看这一页。
---
## 🧩 通过 iframe 嵌入
嵌入编辑器并用 postMessage 驱动。常见分工是:你的系统负责鉴权与存储,iframe 只负责编辑。
```html
```
```js
// 打开文档
iframe.contentWindow.postMessage(
{ id: '1', type: 'document:open-url', payload: { url: 'https://example.com/doc.xlsx' } },
'https://your-deployment',
);
// 监听结果
window.addEventListener('message', (e) => {
if (e.data?.type === 'document:opened') console.log('可以编辑了');
if (e.data?.type === 'document:saved') uploadFile(e.data.payload.file);
});
```
嵌入模式下不会写入本地历史——那份文档属于宿主页面。
→ **[完整 API 文档](docs/embed-api.zh.md)** — 全部消息类型、来源白名单、只读模式与保存流程。
也可以作为组件使用:本项目为
[@ranui/preview](https://www.npmjs.com/package/@ranui/preview)
提供文档预览能力([组件文档](https://chaxus.github.io/ran/src/ranui/preview/))。
---
## 🤖 浏览器 AI Agent(WebMCP)
在支持该能力的浏览器上,页面会注册一组工具,浏览器内的 Agent 可以直接调用,而不必去"看"和"点"
界面:`open_document_url`、`open_document_buffer`、`create_document`、`save_document`、
`get_document_text`、`set_readonly`、`get_document_state`。文档同样不会离开设备——由浏览器
自己抓取和转换。浏览器没有这套 API 时整体无操作,对普通用户零影响。
---
## 🚀 部署
纯静态产物——没有运行时,没有数据库。
```bash
pnpm build # 产物在 dist/
```
### 静态托管(Cloudflare Pages、Nginx、Vercel、Netlify……)
上传 `dist/` 即可。`public/_headers` 里写着本站期望的缓存契约(带哈希的资源永久缓存、
service worker 永不缓存);不支持该文件的托管也能跑,只是会多做校验。
Nginx 需要把 `index.html` 作为未知路由的兜底:
```nginx
location / {
root /var/www/document;
try_files $uri $uri/ /index.html;
}
```
### GitHub Pages
`.github/workflows/pages-build-site.yml` 会在推送到 `main` 时构建并部署。
在仓库设置里启用 Pages,来源选 **GitHub Actions**。
### Docker
```bash
# 基础用法
docker run -d --name document -p 8080:80 ghcr.io/ranuts/document:latest
# 带 HTTPS 与基础认证
docker run -d --name document -p 443:443 \
-v /path/to/certs:/ssl \
-e SERVER_BASIC_AUTH='user:$2y$...' \
-e SERVER_HTTP2_TLS=true \
-e SERVER_HTTP2_TLS_CERT=/ssl/cert.pem \
-e SERVER_HTTP2_TLS_KEY=/ssl/key.pem \
ghcr.io/ranuts/document:latest
```
`SERVER_BASIC_AUTH` 接受 BCrypt 哈希;shell 里需要把 `$` 写成 `$$` 转义。
镜像自身的缓存策略在 `sws.toml`。
---
## 🔤 字体
随附的 OnlyOffice 构建把字体库放在 `public/fonts/`,由
`public/sdkjs/common/AllFonts.js` 建立索引。字体按需拉取——一篇文档只会下载它真正用到的那些。
→ **[字体管理指南](docs/fonts.zh.md)** — 索引字体目录的线格式、各处注册表,
以及如何用 `bin/font-catalog.mjs` 添加字体。
---
## 🛠 开发
```bash
pnpm install --frozen-lockfile
pnpm run dev # 开发服务器
pnpm run build # 生产构建(bin/build.sh)
pnpm run lint # oxlint + tsc + docker 配置检查
pnpm run test # 单元测试(Vitest)
pnpm run test:e2e # 端到端测试(Playwright,真实编辑器 + 真实 WASM)
```
端到端测试跑的是真实编辑器和真实转换器,不是 mock,覆盖文档往返、嵌入协议与恢复流程。
`docs/explorations/` 记录了每一处不显然的设计为什么是现在这样——改编辑器集成之前值得先读。
---
## 📚 基于这些项目
- [sdkjs](https://github.com/ONLYOFFICE/sdkjs) 与 [web-apps](https://github.com/ONLYOFFICE/web-apps) — OnlyOffice 编辑器本体
- [onlyoffice-x2t-wasm](https://github.com/cryptpad/onlyoffice-x2t-wasm) — WASM 文档转换器
- [ranui / ranuts](https://github.com/chaxus/ran) — 本站使用的设计体系与工具库
- [se-office](https://github.com/Qihoo360/se-office)、[onlyoffice-web-local](https://github.com/sweetwisdom/onlyoffice-web-local) — 无文档服务器运行 OnlyOffice 的先行方案
## 🤝 贡献
欢迎提 Issue 和 PR。`main` 受保护:请在分支上开发并提 PR,CI 会跑 lint、单元测试,
以及三套端到端测试(开发服务器、Cloudflare Pages 语义、生产 Docker 镜像)。
## 📄 许可证
[AGPL-3.0](LICENSE)。
本项目是 ONLYOFFICE(sdkjs 与 web-apps,(c) Ascensio System SIA)的衍生作品。上游以
AGPL 发布并附带第 7 条的附加条款:必须保留原产品 logo,且不授予任何商标权利。因此编辑器
头部的 ONLYOFFICE logo 与“关于”面板都予以保留。条款原文、所用 vendor 版本以及我们对它做过
的全部改动见 [NOTICE](NOTICE)。
ONLYOFFICE 是 Ascensio System SIA 的商标。本项目并非官方 ONLYOFFICE 产品,与 Ascensio
System SIA 无隶属关系,也未获其背书。