.ofd后缀改为.zip解压后,可以看到清晰的多层目录结构。OFD 采用"文档(Doc)—页面(Page)—对象(Object)"的层级组织内容。OFD.xml,文件名不可修改。它是访问和解析整个文档的起点,声明文档格式版本和文档对象入口。Document.xml定义文档的逻辑结构,包含公共数据、页面区域、权限控制、页树、大纲、资源引用等。Content.xml,描述该页面的文字、图形、图像等版面对象及其坐标、样式。这是 OFD 解析的核心——所有页面元素都在此文件中以 XML 结构描述。ST_ID标识,页面元素通过ST_RefID引用。DeltaY="g 6 5.95"意思是"接下来的 6 个字符,每个 Y 偏移 5.95mm"(竖排逐字换行)。这种g N X语法是 OFD 规范独有的,解析器必须正确展开。ResourceID引用资源文件中的图片(PNG/JPEG/BMP/TIFF),支持 CTM 变换矩阵。- Seal.esl
:电子印章文件,ASN.1 DER 编码,包含印章头信息、印章属性、印章图片数据、制章人证书和签名 - SignedValue.dat
:签名值文件,ASN.1 DER 编码。电子签章遵循 GB/T 38540(SES_Signature);数字签名(SM2)遵循 GB/T 35275 / GM/T 0010 - SES_Signature 版本
:支持 V1 和 V4 两种格式,结构布局不同,解析器需实现版本检测和分支处理
- 路径解析
:OFD 内部使用 ST_Loc 类型路径(如 ./Res/image_0.png),需支持相对路径和绝对路径 - 懒加载优化
:大文档可按需读取指定页面的 Content.xml 和关联资源 - 编码处理
:ZIP 内文件名可能包含中文,需正确处理 GBK/UTF-8 编码
- 命名空间处理
:元素节点使用 ofd:前缀,解析器需正确注册命名空间以避免查询失败 - CTM 矩阵
:坐标变换矩阵为 6 元素数组 [a b c d e f],对应 2D 仿射变换矩阵 - 批量缩写展开
: DeltaX="g 5 3.5"需展开为 [3.5, 3.5, 3.5, 3.5, 3.5]
从 ImageObject 获取 ResourceID 在 DocumentRes.xml / PageRes.xml 中查找对应资源定义 获取资源的 BaseLoc 路径(相对于 Res 目录) 从 ZIP 中提取图片二进制数据 创建 Image 对象并应用 CTM 变换矩阵
从 OFD.xml 获取 Signatures.xml 路径 解析签名列表,逐个解析 Signature.xml 读取 SignedValue.dat(ASN.1 DER 编码),解析 SES_Signature 结构 提取 Seal.esl 中的印章图片数据并渲染叠加 使用 SM2(国密)或 RSA 算法验签
检查 Encryptions.xml 是否存在(OFD 2.0+ 特性) 使用 decryptseed.dat 中的密钥描述数据解密 - 兼容性注意
:OFD 1.0 的加密支持有限,部分加密文档可能无法在非官方工具中解析
- 数科 OFD 阅读器(Suwell)
:官方推荐客户端,功能最全面(阅读/签批/验签/语义标引),但闭源 - OfdiumEx
:基于 Cairo 库的 C++ 实现,跨平台能力有限,社区维护不活跃 - 数科 OFD 在线体验中心(ofd.cn)
:支持 OFD→PDF 等多格式互转,但需上传文件到第三方服务器,存在数据安全风险
| OFDRW | 是 | 是 | 是 | 是 | 是 | |
| 否 | 是 | 否 | 否 | 是 | ||
| 否 | 间接 | 是 | 是 | 是 | ||
| 否 | 是 | 否 | 否 | 是 | ||
| 是 | 是 | 是 | 否 | |||
| 是 | 是 | 是 | 否 |
| OFDRW | 极高 | |
| 极高 | ||
| 高 | ||
| 中 | ||
| 高 |
| OFD专用库 | OFDRW完整 | 无 | 无 | 无 | 无 |
| PDF生成库 | PDFBox/iText | reportlab | iTextSharp | PoDoFo | unidoc |
| 性能 | 优秀 | 较差 | 优秀 | 最优 | 良好 |
| 开发难度 | 低 | 高 | 高 | 极高 | 高 |
| 开发周期 | |||||
| 维护成本 | 低 | 高 | 中高 | 极高 | 中 |
| 综合评分 | ★★★★★ |
- Java(首选 ★★★★★)
:OFDRW 是唯一覆盖完整 OFD 规范的开源库,开箱即用。开发周期最短(1-2 周),社区活跃,维护成本最低。对于任何严肃的 OFD 转 PDF 项目,Java + OFDRW 都是不二之选。 - C#(次选 ★★★★☆)
:.NET 生态的 ZIP/XML/PDF 库质量优秀,.NET 8 AOT 性能接近原生。需自研 OFD 解析,开发周期 2-3 周。适合已有 .NET 技术栈的团队。 - Go(轻量 ★★★☆☆)
:标准库原生 ZIP/XML + goroutine 并发 + 单二进制部署是独特优势。但 PDF 库和字体生态薄弱。适合微服务和 CLI 工具场景。 - Python(原型 ★★★☆☆)
:开发效率高,适合快速验证。但无 OFD 库、GIL 限制性能。推荐"Python 桥接 Java OFDRW"混合策略。 - C++(高性能 ★★☆☆☆)
:性能最优但开发成本极高(4-8 周)。仅在嵌入式/极致延迟需求场景推荐。
- OFD 规范
:基于 GB/T 33190-2016 标准,采用"XML + ZIP 容器"架构,结构清晰。核心节点包括 OFD.xml→Document.xml→Content.xml→资源索引→签章。页面由 TextObject、PathObject、ImageObject 三类图元构成,坐标单位为毫米。 - 解析流程
:ZIP 解包→入口解析→文档解析→资源预加载→页面解析→元素映射→渲染输出。文字对象最复杂,需处理批量缩写展开、字体加载、逐字符定位。签章需 ASN.1 解码和国密验签。 - 工具生态
:后端以 OFDRW(Java)为首选,支持全格式转换但有字体降级问题。前端以 ofd.js 为首选,支持 SVG/Canvas 预览但不支持 PDF 输出。工具生态仍在发展初期。 - 多语言可行性
:Java 凭借 OFDRW 成为首选方案(开发周期 1-2 周),C# 次选,Go/Python 适合轻量场景,C++ 仅在极致性能需求下考虑。推荐排序:Java > C# > Go > Python > C++。对于快速验证转换效果,可直接使用在线工具http://59.110.20.164。
- 首选方案
:Java + OFDRW + PDFBox/iText,开箱即用,开发周期最短 - 快速验证
:先通过在线工具http://59.110.20.164验证目标 OFD 文档的转换效果,再决定是否投入自研 - .NET 团队
:C# + iTextSharp + System.Xml 自研 OFD 解析 - 轻量部署
:Go 标准库原生 ZIP/XML,goroutine 并发适合批量转换 - 前端预览
:ofd.js 或 @sharp9/ofdjs 在浏览器端 Canvas/SVG 渲染 - 字体兼容
:配置完整字体目录(SimSun、SimHei 等),FreeType 提取字形作为 fallback - 签章处理
:后端 ofdrw-gm 完整 SM2/RSA 双路径验签,前端 sm-crypto 基础展示


