一款基于 Deepin Tool Kit 6 构建的 OFD 电子文档阅读器和简易编辑器,零预装依赖,下载即用。 🚀开源地址:https://github.com/HelloWorld-Dophin/ofd-reader-dtk6
一款基于 Deepin Tool Kit 6 构建的 OFD 电子文档阅读器和简易编辑器,零预装依赖,下载即用。
🚀开源地址:https://github.com/HelloWorld-Dophin/ofd-reader-dtk6
👇 **点击下方链接,一键安装!无需预装 Java!**
安装命令:
sudo dpkg -i ofd-editor_1.0.0_amd64.deb
OFD(Open Fixed-layout Document)是我国自主可控的电子文档版式国家标准(GB/T 33190-2016),广泛应用于:
┌──────────────────────────────────────────────────────────────┐ │ DTK6 C++ 主程序 (ofd-dtk6-editor) │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │ │ │ MainWindow │ │ OfdRender │ │ PropertyPanel │ │ │ │ (UI 组装) │ │ Widget │ │ (属性编辑) │ │ │ └──────┬───────┘ │ (QPainter) │ └────────┬─────────┘ │ │ │ └──────┬───────┘ │ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ OfdJnaBridge (JNI C ABI 桥接) │ │ │ │ dlopen → libofd-jna-core.so → JNA → Java 层 │ │ │ └──────────────────────────┬──────────────────────────┘ │ └─────────────────────────────┼────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ Java 层 (ofd-jna-core) │ │ │ │ JNA 5.14 接口绑定 ofdrw-full 2.0.2 │ │ ├── OFDFfi.java ├── OfdReader (文档打开/解析) │ │ ├── OfdPageElements ├── OfdPathParser (Path 解析) │ │ ├── OfdImageLoader └── OfdFontResolver │ │ └── OfdException (全模块: reader/core/pkg/layout │ │ /gv/sign/font/graphics2d) │ └─────────────────────────────────────────────────────────────┘
1. JNA FFI 而非 JNI
直接用 JNI 手写原生方法工作量大且维护困难。JNA 允许在 C++ 侧 dlopen 加载 .so 后直接调用,Java 侧只用一个 interface 声明方法签名,自动映射。
dlopen
.so
2. 内置裁剪 JRE(零预装依赖)
用 JDK17 的 jlink 工具从完整 JDK 裁剪出仅包含运行所需模块的 JRE:
jlink
jlink \ --add-modules java.base,java.desktop,java.xml,java.logging,java.management,\ java.security.sasl,java.net.http,jdk.unsupported,jdk.zipfs,\ jdk.crypto.ec,java.prefs,java.naming,java.scripting \ --compress 2 --strip-debug --no-header-files --no-man-pages \ --output ./jre
产物 ~50MB(完整 JDK17 通常 300MB+)。
3. LD_LIBRARY_PATH 覆盖 RUNPATH
libofd-jna-core.so 硬编码了 RUNPATH 指向系统 JDK,但 ELF 动态链接器优先级是 LD_LIBRARY_PATH > DT_RUNPATH。启动脚本只需:
libofd-jna-core.so
export LD_LIBRARY_PATH="$APP_HOME/jre/lib/server:$APP_HOME/lib:$LD_LIBRARY_PATH"
就能强制 JVM 加载内置的 libjvm.so,用户电脑完全不需要预装 Java。
libjvm.so
4. symlink 安全的启动脚本
.desktop 的 Exec=/usr/bin/ofd-editor 实际是 symlink → /opt/ofd-editor/bin/ofd-editor。脚本必须用 readlink -f "$0" 解析到真实物理路径,否则 $0 会拿到 /usr/bin/ofd-editor,APP_HOME 算成 /usr —— 所有路径全部错。
.desktop
Exec=/usr/bin/ofd-editor
/opt/ofd-editor/bin/ofd-editor
readlink -f "$0"
$0
/usr/bin/ofd-editor
/usr
5. 字体路径多候选
可执行文件在 bin/ 下,字体在 bin/../fonts/。开发版和发布版目录结构不同,字体加载函数同时扫描 3 个候选路径:
bin/
bin/../fonts/
../fonts
./fonts
$OFD_EDITOR_FONTS
deb 包体积 ~88MB,包含:
不需要预装 OpenJDK! 系统只会自动拉取 Qt6/DTK6 运行时依赖。
/opt/ofd-editor/ ← 程序主体 ├── bin/ │ ├── ofd-dtk6-editor ← C++ ELF 主程序 │ └── ofd-editor ← Bash shebang 启动脚本(应用程序格式,无后缀) ├── lib/ │ └── libofd-jna-core.so ← JNI C ABI 桥接 ├── java/ │ ├── classes/ ← Java 编译产物 │ └── libs/ ← 38 个依赖 jars ├── jre/ ← jlink 裁剪版 JRE(50MB,无 javac) │ ├── bin/java │ └── lib/server/libjvm.so ← JVM 本体 ├── fonts/ ← 8 款内置字体 └── share/icons/ /usr/bin/ofd-editor → /opt/ofd-editor/bin/ofd-editor ← symlink 入口 /usr/share/applications/ofd-editor.desktop ← 桌面入口 /usr/share/icons/hicolor/scalable/apps/ofd-editor.svg ← 应用图标
# 命令行 /usr/bin/ofd-editor /path/to/document.ofd # 或双击桌面图标 / 任务栏点击 / 开始菜单搜索 "OFD"
欢迎反馈问题!
kelvinxi@outlook.com
本项目采用 Apache License 2.0 开源,可自由用于商业用途。
依赖说明:
投递应用商店吧
期待上架,这也太厉害了
Featured Collection
Popular Events
🎉 OFD 阅读器(编辑器)— Deepin DTK6 原生应用 发布啦!
📷️运行截图:
🚀
立即下载:Deepin/UOS 安装包(88MB,含内置 JRE + 字体 + 所有依赖)请下载1.0.1版本:https://bbs.deepin.org.cn/post/301987
📖下载平台📦 下载项🚀蓝奏云 密码:1ohf123云盘夸克网盘🚀阿里云盘安装命令:
📖 关于 OFD
OFD(Open Fixed-layout Document)是我国自主可控的电子文档版式国家标准(GB/T 33190-2016),广泛应用于:
✨ 功能特性
📚 文档渲染
✏️
编辑能力(正在开发)特性状态文字对象属性编辑(字体 / 字号 / 颜色)✅图形元素属性编辑(填充色 / 描边色 / 线宽)✅选中元素(鼠标框选 + 点击命中)✅页面元素列表展示(便于精确定位)✅另存为新 OFD 文件✅🎨 界面体验
🏗️ 技术架构
技术栈一览
🔑 几个关键设计决策
1. JNA FFI 而非 JNI
直接用 JNI 手写原生方法工作量大且维护困难。JNA 允许在 C++ 侧
dlopen加载.so后直接调用,Java 侧只用一个 interface 声明方法签名,自动映射。2. 内置裁剪 JRE(零预装依赖)
用 JDK17 的
jlink工具从完整 JDK 裁剪出仅包含运行所需模块的 JRE:产物 ~50MB(完整 JDK17 通常 300MB+)。
3. LD_LIBRARY_PATH 覆盖 RUNPATH
libofd-jna-core.so硬编码了 RUNPATH 指向系统 JDK,但 ELF 动态链接器优先级是 LD_LIBRARY_PATH > DT_RUNPATH。启动脚本只需:就能强制 JVM 加载内置的
libjvm.so,用户电脑完全不需要预装 Java。4. symlink 安全的启动脚本
.desktop的Exec=/usr/bin/ofd-editor实际是 symlink →/opt/ofd-editor/bin/ofd-editor。脚本必须用readlink -f "$0"解析到真实物理路径,否则$0会拿到/usr/bin/ofd-editor,APP_HOME 算成/usr—— 所有路径全部错。5. 字体路径多候选
可执行文件在
bin/下,字体在bin/../fonts/。开发版和发布版目录结构不同,字体加载函数同时扫描 3 个候选路径:../fonts(发布版)./fonts(开发版)$OFD_EDITOR_FONTS(环境变量覆盖)📦 安装 & 运行
deb 包体积 ~88MB,包含:
.so.desktop入口不需要预装 OpenJDK! 系统只会自动拉取 Qt6/DTK6 运行时依赖。
目录结构(安装后)
启动方式
🖼️ 渲染质量对比
测试用例:国家税务总局增值税电子普通发票
🚧 当前限制
⚠️ 编辑功能为"简易"级别(主要解决渲染 + 属性编辑 + 另存为),非完整 OFD 编辑器🗺️ 未来计划
🤝 贡献
欢迎反馈问题!
kelvinxi@outlook.com📄 开源许可
本项目采用 Apache License 2.0 开源,可自由用于商业用途。
依赖说明:
💖 致谢