可行性评估:ofdrw (Java) → C++20 Static Lib
一、项目规模概览
| 指标 | 数值 |
|---|
| Java 源文件 | 683 个 |
| 总代码行数 | ~91,217 行 |
| Maven 模块 | 13 个 |
| Java 版本 | 1.8 |
| 授权协议 | Apache 2.0 |
二、模块明细
| 模块 | 文件数 | 代码行 | 复杂度 | 核心功能 |
|---|
| ofdrw-core | 261 | 24,721 | ⚠️ 极高 | OFD 数据结构、XML DOM 抽象层、类型系统 |
| ofdrw-layout | 114 | 21,682 | 高 | OFD 布局引擎 |
| ofdrw-converter | 79 | 15,898 | 高 | OFD→PDF/图片/SVG/HTML 格式转换 |
| ofdrw-gm | 62 | 6,877 | 中高 | 国密 SM2/SM3/SM4 算法 + ASN.1 结构 |
| ofdrw-reader | 36 | 5,899 | 中 | OFD 文档解析 |
| ofdrw-sign | 59 | 5,216 | 中 | 数字签章 |
| ofdrw-pkg | 29 | 3,670 | 中 | OFD 打包/解包 (ZIP) |
| ofdrw-graphics2d | 11 | 3,667 | 中 | AWT Graphics2D 桥接 |
| ofdrw-crypto | 16 | 1,573 | 中低 | 加密支持 (GMT 0099) |
| ofdrw-tool | 10 | 1,400 | 低 | 文档合并裁剪工具 |
| ofdrw-font | 4 | 588 | 低 | 字体处理 |
| 其他 | 2 | 26 | 极低 | gv(全局变量), full(整合包) |
三、技术依赖分析
| Java 依赖 | C++20 替代方案 | 迁移难度 |
|---|
| dom4j (XML DOM) | pugixml / libxml2 | ⚠️ 高 — core 架构层深度绑定,整个DefaultElementProxy 体系需要重新设计 |
| BouncyCastle (密码) | OpenSSL / GmSSL | ⚠️ 高 — 国密 SM2/3/4 算法在 C++ 侧需要专门的库支持 |
| AWT (Graphics2D, Font, Color, BufferedImage) | cairo / Skia / AGG | ⚠️ 高 — ofdrw-graphics2d 和 ofdrw-converter 依赖深 |
| Java NIO/IO (Path, Zip streams) | std::filesystem + | 中等 |
| miniz/zlib Apache commons-io | 自行实现 | 低 |
| Twelvemonkeys imageio-tiff | libtiff | 低 |
四、Java → C++20 核心语义转换挑战
| Java 特性 | C++20 对应方案 | 难度 |
|---|
| 接口 (interface) | 纯虚类 / concept | 中等 |
| 泛型 (generics) | template | 中等 |
| Lambda/Stream | std::ranges / lambda | 中等 |
| 反射 (reflection) | ❌ C++ 没有反射 | 高 — 需手动重构 |
| GC / try-with-resources | RAII / unique_ptr | 中等 |
| 注解 (@Deprecated等) | [[deprecated]] attribute | 低 |
| 序列化 (Serializable) | 需要手动实现 | 中等 |
| 动态类加载 | ❌ 不可用 | 需替代方案 |
五、可行性结论
✅ 技术可行,但存在重大约束
推荐方案:分阶段、按模块手动重写
| 方案 | 预估工作量 | 说明 |
|---|
| 方案 A:全量移植 | 6~12人月 | 约 91K 行 Java → C++,含所有模块。属于大型工程 |
| 方案 B:核心子集 (core + pkg + layout) | 3~5 人月 | 仅支持 OFD 文档生成,跳过 converter/ sign/ crypto |
| 方案 C:JNI 桥接 (即用原 Java 库) | 1~2 周 | 用 C++ 通过 JNI 调用原 Java 库,无需移植代码 |
❌ 不建议全量自动转换
现有 Java → C++ 转换工具(如 j2c、手动脚本)对这类重度依赖 Java 生态(dom4j、AWT、BouncyCastle) 的项目失效率达 80%
以上,输出不可维护。
请问您期望的使用场景是什么? 这将帮助我确定最佳方案:
- 如果你只需要 生成/读取 OFD 文档,建议走 方案 B(核心子集)
- 如果你需要 OFD 签章/国密/格式转换,建议走 方案 A(全量移植) 或考虑 方案 C(JNI 桥接)
- 如果你能接受 混合方案,也可以先移植核心模块,其他模块后续补上