乐于分享
好东西不私藏

OFD 格式深度解析:国内自主版式文档标准与 HTML 转换实践

OFD 格式深度解析:国内自主版式文档标准与 HTML 转换实践

OFD(Open Fixed-layout Document)是中国自主研发的国家标准版式文档格式,用于替代 PDF 在政务、金融等领域的应用。本文解析 OFD 的技术架构、应用场景,以及如何将 HTML/Markdown 转换为 OFD 文件。

一、OFD 是什么

OFD 全称 Open Fixed-layout Document(开放版式文档),是中国自主研发的版式文档格式。

诞生背景

在 OFD 出现之前,全球版式文档市场被 Adobe 公司的 PDF 格式垄断。

安全隐患:

  • PDF 核心技术标准掌握在国外公司手中
  • 政府公文、机密档案、电子发票等敏感数据存在信息安全风险
  • 加密算法、授权机制可能被外部控制

国家标准:

  • 2016 年发布国家标准 GB/T 33190-2016
  • 解决电子公文的安全性、自主可控性和长期归档问题
  • 深度集成国密算法(SM2、SM3、SM4)

核心定位

OFD 是中国为信息安全、自主可控、机器易读性而量身定制的国产化 PDF 替代品。

二、OFD vs PDF 技术架构对比

OFD 和 PDF 都是固定版式文档,但底层架构完全不同。

PDF 的底层结构

PostScript 指令流:

  • 源自打印机语言,底层是复杂的绘图指令
  • 强项是跨平台渲染绝对一致
  • 解析消耗资源大,文件结构相对封闭

示例:

% PDF 绘图指令片段
10 10 moveto
100 10 lineto
stroke

OFD 的底层结构

XML 容器架构:

  • 底层结构类似 OOXML(Office 格式)
  • .ofd
     文件本质是 ZIP 压缩包
  • 解压后包含层次分明的 XML 文件和资源文件夹

文件结构:

output.ofd (重命名为 .zip 后解压)
├── OFD.xml              # 文档入口
├── Doc_0/
│   ├── Document.xml     # 文档结构
│   ├── Pages/
│   │   ├── Page_0/
│   │   │   └── Content.xml  # 页面内容(坐标、文字)
│   ├── Res/             # 资源文件夹
│   │   ├── Fonts/       # 字体
│   │   └── Images/      # 图片

页面描述示例:

<ofd:TextObjectID="1"Boundary="50 100 200 20">
    <ofd:TextCode>这是一段文字</ofd:TextCode>
    <ofd:Font>宋体</ofd:Font>
</ofd:TextObject>

架构对比

维度
PDF
OFD
底层格式
PostScript 指令流
XML 树状结构
数据提取
困难(需解析指令)
容易(直接读取 XML)
文件体积
较大
较小(优化中文字体)
加密算法
国际标准
国密算法
扩展性
较弱
强(XML 易扩展)

三、OFD 的核心优势

OFD 在特定场景下具有明显优势。

1. 自主可控的安全性

国密算法集成:

  • SM2 椭圆曲线公钥密码算法(签名验签)
  • SM3 密码杂凑算法(数据完整性)
  • SM4 分组密码算法(数据加密)

法律效力:

  • 电子签章符合《电子签名法》要求
  • 在政务、司法领域具有最高级别认可

2. 体积更小

优化策略:

  • XML 压缩技术
  • 中文字体子集化(只嵌入使用的字符)
  • 资源复用机制

实测数据:
同等内容下,OFD 文件体积通常只有 PDF 的 50%-70%。

3. 机器易读性

结构化数据:

  • XML 节点可直接嵌入元数据
  • 无需 OCR 即可提取结构化信息

应用示例:

<!-- OFD 电子发票内嵌数据 -->
<ofd:CustomData>
    <Invoice>
      <Code>044031900111</Code>
      <Amount>1580.00</Amount>
      <TaxNumber>91110000MA01234567</TaxNumber>
    </Invoice>
</ofd:CustomData>

财务系统可直接读取 XML 数据,无需文本识别。

4. 原生支持国产环境

信创生态:

  • 完美适配国产操作系统(统信 UOS、麒麟 Kylin)
  • 支持国产 CPU(龙芯、飞腾、鲲鹏)
  • 集成国产办公软件(WPS、数科、金山)

四、OFD 的应用场景

OFD 主要应用于政府和企业级场景。

G 端(政府)应用

电子公文:

  • 各级政府机关流转的红头文件
  • 公文归档和长期保存
  • 跨部门文件交换

电子证照:

  • 电子身份证、电子营业执照
  • 不动产权证、资质证书
  • 行政许可证明

B 端(企业)应用

电子发票:

  • 税务总局推行的全电发票
  • 增值税电子专用发票
  • 财务系统自动入账

金融票据:

  • 银行对账单、电子回单
  • 保险单据、理财凭证
  • 电子合同签署

医疗档案:

  • 电子病历长期存储
  • 医学影像报告
  • 健康档案管理

为什么普通用户很少见到

OFD 目前主要在政务和大型企业内部流转,C 端(消费者)应用较少。但随着电子发票普及,普通用户接触 OFD 的机会正在增加。

五、HTML/Markdown 转 OFD 技术方案

前端开发者如何生成 OFD 文件?

现状:缺少纯 JS 方案

技术壁垒:

  • 排版引擎极其复杂(流式布局转固定版式)
  • OFD 生态封闭,核心技术掌握在商业公司手中
  • 国密算法在纯前端环境下性能差且不安全

结论:
目前没有成熟的纯 JavaScript 库可以直接将 HTML 转换为 OFD。

方案 A:曲线救国(开源方案)

技术路径:HTML/Markdown → PDF → OFD

这是目前开源生态中最可行的方案。

第一步:HTML 转 PDF

使用 Node.js + Puppeteer(无头 Chrome 浏览器):

// Node.js 代码
const puppeteer require('puppeteer');

async function htmlToPdf(htmlContent, outputPath{
const browser await puppeteer.launch();
const page await browser.newPage();

await page.setContent(htmlContent);
await page.pdf({
    path: outputPath,
    format:'A4',
    printBackground:true
});

await browser.close();
}

// 使用示例
const html ='<h1>标题</h1><p>内容</p>';
htmlToPdf(html,'output.pdf');

第二步:PDF 转 OFD

使用 Java + ofdrw 开源库:

import org.ofdrw.converter.ConvertHelper;

public class PdfToOfd {
    public static void main(String[] args){
        String pdfPath ="output.pdf";
        String ofdPath ="output.ofd";

        try{
            // 调用转换
            ConvertHelper.pdf2ofd(pdfPath, ofdPath);
            System.out.println("转换成功");
        } catch (Exception e{
            e.printStackTrace();
        }
    }
}

完整流程:

Markdown 文本
  ↓ (marked.js)
HTML 内容
  ↓ (Puppeteer)
PDF 文件
  ↓ (ofdrw)
OFD 文件

方案 B:商业 API(企业级方案)

适用场景:

  • 政务或金融项目
  • 需要电子签章和国密加密
  • 要求高保真度和合规性

主流厂商:

数科网维(Suwell):

  • 国内 OFD 领域龙头企业
  • 提供文档转换服务器
  • 支持 HTTP API 调用

福昕(Foxit):

  • 提供企业级文档转换服务
  • 支持批量处理和签章

调用方式:

// 前端调用示例
const formData new FormData();
formData.append('html', htmlContent);

fetch ('https://api.vendor.com/convert/html2ofd',{
  method'POST',
  body: formData,
  headers{
     'Authorization''Bearer YOUR_API_KEY'
  }
})
.then(res=> res.blob())
.then(blob=> {
    // 下载 OFD 文件
    const url URL.createObjectURL(blob);
    const a document.createElement('a');
      a.href= url;
      a.download='output.ofd';
      a.click();
});

方案 C:模板填充(实际业务常用)

适用场景:

  • 生成固定格式的公文或发票
  • 不需要转换任意 HTML

工作流程:

  1. 使用 OFD 模板设计器创建带占位符的模板
  2. 前端收集表单数据(JSON)
  3. 后端读取模板,填充数据,生成 OFD

Java 代码示例:

import org.ofdrw.layout.OFDDoc;
import org.ofdrw.layout.element.Paragraph;

public class TemplateGenerator {
    public static void main(String[] argsthrows Exception {
        // 创建 OFD 文档
        try (OFDDoc doc new OFDDoc("output.ofd"){
            // 添加段落
            Paragraph p new Paragraph("发票号码:044031900111");
            doc.add(p);

            Paragraph p2 new Paragraph("金额:1580.00 元");
            doc.add(p2);
        }
    }
}

六、技术方案对比与选型建议

不同方案的适用场景和优缺点。

方案对比

方案
成本
保真度
签章支持
适用场景
HTML→PDF→OFD
免费
中等
需额外开发
原型验证、内部系统
商业 API
付费
原生支持
政务、金融项目
模板填充
免费/付费
可集成
固定格式文档

潜在问题

PDF 转 OFD 的局限性:

  1. 非 100% 完美转换
    :复杂矢量图形、特殊字体可能有轻微差异
  2. 体积变大
    :转换后的 OFD 比原生生成的体积更大
  3. 丢失交互性
    :HTML 表单元素会变成静态图像
  4. 字体兼容性
    :特殊字体可能退化为默认字体

选型建议

原型验证、内部系统:

  • 使用 HTML → PDF → OFD 开源方案
  • 工具链:Puppeteer + ofdrw
  • 优点:零成本、快速上线

政务、金融项目:

  • 使用商业厂商 API
  • 厂商:数科网维、福昕
  • 优点:合规、稳定、支持签章

固定格式文档:

  • 使用模板填充方案
  • 工具:ofdrw + 模板设计器
  • 优点:高效、保真度高

总结

OFD 核心特点:

OFD 是中国自主研发的国家标准版式文档格式,采用 XML 容器架构,深度集成国密算法,主要应用于政务、金融等领域。相比 PDF,OFD 在安全性、自主可控性和机器易读性方面具有明显优势。

技术架构对比:

PDF:PostScript 指令流 → 渲染一致但难解析
OFD:XML 树状结构 → 易解析、易扩展、体积小

HTML 转 OFD 方案:

开源方案:HTML → (Puppeteer) → PDF → (ofdrw) → OFD
商业方案:HTML → (厂商 API) → OFD + 签章
模板方案:数据 → (模板引擎) → OFD

关键结论:

  • 纯前端 JS 无法直接生成 OFD
  • 开源方案需借助 PDF 作为中间格式
  • 企业级应用建议使用商业 API
  • 固定格式文档优先使用模板填充

生态现状:

OFD 目前主要在政企市场应用,开源生态相对薄弱。随着信创产业发展和电子发票普及,OFD 的应用范围正在逐步扩大。对于开发者而言,理解 OFD 的技术架构和转换方案,将有助于在相关项目中做出正确的技术选型。

参考http://wiki.easyofd.cn/zh/OFD%E6%A0%87%E5%87%86


觉得有帮助?欢迎点赞、在看、转发三连~