8.3 KiB
8.3 KiB
yx_only_office_flutter
面向 Flutter 项目的 ONLYOFFICE 文档查看与编辑插件。基于 webview_flutter 实现,完全遵循 ONLYOFFICE Docs API 官方规范。
官方参考
- ONLYOFFICE Docs API - Basic Concepts
- ONLYOFFICE Documents App for Android
- ONLYOFFICE Documents App for iOS
功能特性
- ✅ 完整的查看与编辑支持:支持
view和edit两种模式 - ✅ 标准配置结构:完全遵循官方 DocsAPI 配置规范
- ✅ 丰富的事件桥接:支持
onError、onAppClose、onDownloadAs、onRequestSaveAs、onRequestInsertImage、onDocumentStateChange等事件 - ✅ JWT 签名支持:内置 HMAC-SHA256 JWT 签名工具
- ✅ 高度可定制:支持自定义 UI、权限、语言、用户信息等
- ✅ 跨平台支持:同时支持 Android 和 iOS
环境要求
- 可访问的 ONLYOFFICE Document Server(云端或自建)
- 能够提供可下载的文件地址(HTTP/HTTPS)
- Flutter 3.3+,Dart 3.9.2+
安装
dependencies:
yx_only_office_flutter: ^0.1.0
或使用命令:
flutter pub add yx_only_office_flutter
快速开始
1. 查看文档(只读模式)
import 'package:flutter/material.dart';
import 'package:yx_only_office_flutter/yx_only_office_flutter.dart';
class DocumentViewerPage extends StatelessWidget {
const DocumentViewerPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('文档查看')),
body: YxOnlyOfficeViewer.create(
serverUrl: 'https://your-onlyoffice-server.com',
fileUrl: 'https://example.com/document.docx',
mode: 'view', // 只读模式
title: '示例文档.docx',
allowDownload: true,
allowPrint: false,
user: const OnlyOfficeUser(
id: 'user123',
name: '张三',
),
onError: (error) {
debugPrint('文档加载错误: $error');
},
),
);
}
}
2. 编辑文档
YxOnlyOfficeViewer.create(
serverUrl: 'https://your-onlyoffice-server.com',
fileUrl: 'https://example.com/document.docx',
mode: 'edit', // 编辑模式
title: '可编辑文档.docx',
user: const OnlyOfficeUser(
id: 'user123',
name: '张三',
email: 'zhangsan@example.com',
),
onDocumentStateChange: (data) {
// 文档状态变化(是否有未保存的修改)
final isModified = data ?? false;
debugPrint('文档已修改: $isModified');
},
onRequestSaveAs: (data) {
// 用户点击"另存为"
debugPrint('请求保存: $data');
},
onRequestInsertImage: (data) {
// 用户请求插入图片(可以打开 Flutter 图片选择器)
debugPrint('请求插入图片: $data');
},
)
3. 使用 JWT 签名(推荐用于生产环境)
const jwtSecret = String.fromEnvironment('ONLYOFFICE_JWT_SECRET');
YxOnlyOfficeViewer.create(
serverUrl: 'https://your-onlyoffice-server.com',
fileUrl: 'https://example.com/document.docx',
mode: 'edit',
tokenFactory: jwtSecret.isNotEmpty
? OnlyOfficeJwtSigner(jwtSecret)
: null,
onError: (error) => debugPrint('错误: $error'),
)
4. 高级配置(手动构建配置)
final config = OnlyOfficeConfigFactory.create(
fileUrl: 'https://example.com/document.docx',
mode: 'edit',
title: '高级配置文档.docx',
lang: 'zh-CN',
user: const OnlyOfficeUser(
id: 'user123',
name: '张三',
email: 'zhangsan@example.com',
),
customization: const OnlyOfficeCustomization(
compactToolbar: true,
hideRightMenu: false,
toolbarNoTabs: false,
),
tokenFactory: OnlyOfficeJwtSigner('your-secret-key'),
);
YxOnlyOfficeViewer(
serverUrl: 'https://your-onlyoffice-server.com',
config: config,
onEvent: (event, data) {
// 通用事件处理器,捕获所有事件
debugPrint('事件: $event, 数据: $data');
},
)
支持的文档格式
插件自动识别以下文档类型:
文字处理 (word)
doc, docx, docm, dot, dotx, dotm, odt, fodt, ott, rtf, txt, html, htm, mht, xml, pdf, djvu, fb2, epub, xps
电子表格 (cell)
xls, xlsx, xlsm, xlt, xltx, xltm, ods, fods, ots, csv
演示文稿 (slide)
ppt, pptx, pptm, pps, ppsx, ppsm, pot, potx, potm, odp, fodp, otp
事件回调说明
| 事件 | 说明 | 回调参数 |
|---|---|---|
onError |
文档加载或编辑错误 | String error |
onAppClose |
用户请求关闭编辑器 | 无 |
onDownloadAs |
文档下载完成 | String fileType, String url |
onRequestSaveAs |
用户点击"另存为" | dynamic data |
onRequestInsertImage |
用户请求插入图片 | dynamic data |
onDocumentStateChange |
文档修改状态变化 | dynamic data (boolean) |
onMetaChange |
文档元数据变化 | dynamic data |
onMakeActionLink |
创建操作链接 | dynamic data |
onEvent |
通用事件处理器 | String event, dynamic data |
配置类说明
OnlyOfficeConfig
顶层配置对象,包含:
document: 文档元数据(OnlyOfficeDocument)documentType: 文档类型(word/cell/slide)editorConfig: 编辑器配置(OnlyOfficeEditorConfig)type: 客户端类型(默认mobile)token: JWT 令牌(可选)
OnlyOfficeDocument
文档信息:
fileType: 文件扩展名(如docx)key: 文档唯一标识(自动生成或手动指定)title: 文档标题url: 文档下载地址permissions: 文档权限(OnlyOfficePermissions)
OnlyOfficeEditorConfig
编辑器设置:
mode: 模式(view或edit)lang: 界面语言(默认zh-CN)user: 用户信息(OnlyOfficeUser)customization: UI 自定义(OnlyOfficeCustomization)callbackUrl: 回调地址(可选,用于服务端保存)
OnlyOfficePermissions
权限控制:
edit: 是否允许编辑download: 是否允许下载print: 是否允许打印review: 是否允许审阅comment: 是否允许评论copy: 是否允许复制fillForms: 是否允许填写表单
OnlyOfficeCustomization
UI 定制:
compactToolbar: 紧凑工具栏hideRightMenu: 隐藏右侧菜单hideLeftMenu: 隐藏左侧菜单hideRulers: 隐藏标尺toolbarNoTabs: 工具栏无标签页showReviewChanges: 显示审阅更改
JWT 签名
插件内置 OnlyOfficeJwtSigner 类,使用 HMAC-SHA256 算法签名配置:
const signer = OnlyOfficeJwtSigner('your-secret-key');
final token = signer.sign(config.toJson());
安全提示:
- ⚠️ 不要在客户端硬编码 JWT 密钥
- ✅ 推荐通过环境变量或服务端 API 获取签名
- ✅ 生产环境应在服务端完成签名
示例工程
查看 example/ 目录获取完整示例,包括:
- 基础查看功能
- 编辑模式演示
- JWT 签名集成
- 事件处理示例
- 集成测试
运行示例:
cd example
flutter run \
--dart-define ONLYOFFICE_SERVER_URL=https://your-server.com \
--dart-define ONLYOFFICE_FILE_URL=https://example.com/doc.docx \
--dart-define ONLYOFFICE_JWT_SECRET=your-secret
常见问题
1. 文档无法加载?
检查:
- Document Server 是否可访问
- 文件 URL 是否可下载
- JWT 签名是否正确(如果启用)
- 网络权限是否配置(Android/iOS)
2. 编辑模式不生效?
确保:
mode设置为'edit'document.permissions.edit为true- 用户信息已正确配置
3. 如何保存编辑后的文档?
ONLYOFFICE 支持两种保存方式:
- 服务端回调:配置
callbackUrl,Document Server 会将修改推送到你的服务器 - 客户端下载:监听
onDownloadAs事件,获取修改后的文档 URL
兼容性
- ✅ Android 5.0+
- ✅ iOS 11.0+
- ✅ ONLYOFFICE Document Server 6.1+
许可证
本项目采用 MIT 许可证,详见 LICENSE 文件。
贡献
欢迎提交 Issue 和 Pull Request!
更新日志
查看 CHANGELOG.md 了解版本更新历史。