编辑器完全在浏览器里用 OnlyOffice WebAssembly 引擎运行,文档在客户端渲染和编辑——你不需要部署文档服务器。推荐模式保持清晰边界: **父应用负责鉴权、拉取与保存;iframe 只负责编辑。**token、cookie 和业务 API 都留在你的应用里。
一个 iframe 就能接入
<iframe
id="documentEditor"
src="https://edit.chaxus.com/editor?embed=1&embedOrigin=https://your-app.example.com"
style="width: 100%; height: 720px; border: 0"
></iframe>
然后用 postMessage 和它通信。每条命令带一个 id 用来匹配回复,编辑器的每个事件都是 document:* 消息:
// 打开一个你的应用已经拉取好的文件(鉴权全在你这边)
iframe.contentWindow.postMessage(
{ id, type: 'document:open-buffer', payload: { fileName: 'report.xlsx', buffer } },
'https://edit.chaxus.com',
);
// 要回编辑后的文件,再由你自己上传
iframe.contentWindow.postMessage({ id, type: 'document:save', payload: { targetExt: 'XLSX' } }, editorOrigin);
// → 编辑器回复 { type: 'document:saved', payload: { fileName, file } }
你能得到什么
- 一个 iframe + 一套小巧的 postMessage 命令/响应 API——无需安装 SDK
- 从 URL、File 或 ArrayBuffer 打开(都由你的应用用自己的凭据拉取)
- 保存回 XLSX、DOCX、PPTX 或 CSV,以
File返回给你的应用上传 - 只读模式、按消息锁定 origin(
embedOrigin)、状态查询 - 无需部署文档服务器——编辑 100% 是客户端 WebAssembly
- 开源(AGPL-3.0)、可自托管——在你自己的域名下嵌入
工作原理
- 加入指向
/editor?embed=1的 iframe,按布局设尺寸。 - 等
document:ready事件,再发送document:open-url、open-file或open-buffer。 - 用户就地编辑;除非你的应用主动发送,文件不会离开浏览器。
- 发送
document:save,编辑器通过document:saved返回编辑后的文件,由你的应用用自己的鉴权上传。
只读与预览模式
需要"只看不改"(预览器、审阅环节、已归档记录)时,在打开命令里传 readonly: true;随时可以用 document:set-readonly 切换——不重新加载,文档停在用户原来的位置。只读期间禁止编辑, document:save 返回 document:error;document:get-state 会报告当前的 readonly 状态。
// 锁定打开,稍后解锁
send('document:open-url', { url, readonly: true });
send('document:set-readonly', { readonly: false });
常见问题
怎么嵌入这个文档编辑器?
加入一个指向 /editor?embed=1 的 iframe,再用 postMessage API 驱动它打开与保存文档。可运行 demo 在 /embed-demo.html。
编辑器会看到我用户的鉴权 token 吗?
不会。鉴权、文件拉取和上传都留在你的应用里——你的应用用自己的凭据拉取文件、把二进制传给编辑器,token 和 cookie 永远不会进入 iframe。
嵌入的编辑器支持哪些文件格式?
DOCX、XLSX、PPTX 和 CSV,用 OnlyOffice WebAssembly 引擎在客户端编辑。保存命令可导出为 XLSX、DOCX、PPTX 或 CSV。
可以自托管或白标使用吗?
可以。它以 AGPL-3.0 开源、是纯静态文件,你可以自托管一份、在自己的域名下嵌入。
怎么限制哪个站点能和编辑器通信?
在 iframe URL 上加 embedOrigin 把消息锁定到指定 origin,并在你自己的消息处理里校验 event.origin。
能只读展示文档,或者过一会儿再锁定吗?
能。打开时传 readonly: true,或随时发送 document:set-readonly——它直接切换正在运行的编辑器、不重新加载,锁定期间保存会被拒绝。