一、引言

在电子政务、财务票据、档案管理等场景中,OFD(Open Fixed-layout Document)格式正逐渐成为中国电子文档的主流标准。作为 GB/T 33190-2016 国家标准,OFD 与 PDF 类似,但更贴合国内业务需求。

然而,浏览器原生并不支持 OFD 预览。传统方案往往依赖后端转换或第三方插件,部署复杂且体验不佳。EasyOFD 应运而生 —— 这是一个纯 JavaScript 实现的 OFD 浏览器渲染引擎,无需任何后端服务,直接在浏览器中使用 HTML Canvas 完成 OFD 文件的解析与渲染。

二、项目概述

EasyOFD 是一个轻量级、高性能的 OFD 文档查看器,具有以下核心特性:

  • 纯前端实现:不依赖任何后端服务,所有解析和渲染都在浏览器端完成
  • 高性能渲染:基于 HTML Canvas,支持多页连续渲染与虚拟滚动
  • 丰富的交互功能
    • 缩放控制(滑块 + 按钮,25% ~ 300%)
    • 页面导航(首页、上一页、下一页、末页、跳转指定页)
    • 三种视图模式(单页、连续、双页)
    • 打印功能(自动适配 OFD 页面尺寸)
    • 文字内容复制(透明文字层)
  • 开箱即用:打包后自包含 CSS 样式,无需额外配置
  • 符合国家标准:完整实现 GB/T 33190-2016 核心章节

三、标准合规性

EasyOFD 严格遵循 GB/T 33190-2016 国家标准实现,以下是核心章节的覆盖情况:

标准章节 功能模块 实现状态
§5 文件总体结构 ZIP 解包、XML 解析、OFD.xml 读取 ✅ 已完成
§7 文档结构 Document.xml、Page、Layer、PageBlock ✅ 已完成
§7.16 签名 电子印章(2014/2020 版 TLV 格式) ✅ 已完成
§7.17 注释 PageAnnot、Annot、Appearance ✅ 已完成
§8 图形设计 Path、Arc、Color、DrawParam ✅ 已完成
§10 文字处理 Text、Font、TextCode、CGTransform ✅ 已完成
§11 多媒体 MultiMedia(Image/Video/Audio) ✅ 已完成
§15 签名 Signatures、Signature、SealFile ✅ 已完成

此外,项目还实现了 CTM 坐标变换矩阵、底纹(Pattern)、颜色空间(ColorSpace)等高级特性的基础解析,部分渲染功能持续完善中。

四、快速上手

方式一:Vue 3 项目中使用

1. 创建 Vue 3 项目

npm create vue@latest
cd your-project
npm install
npm run dev

2. 安装 EasyOFD 及依赖

# 安装依赖库
npm i jszip x2js jb2 opentype.js

# 安装 EasyOFD
npm i easyofd

3. 创建 OFD 组件

src/components/ 目录下创建 UseOfd.vue

<script setup>
import EasyOFD from "easyofd";
import { onMounted } from 'vue'

onMounted(() => {
  let yourElement = document.getElementById("1111111");
  let ofd = new EasyOFD('myofdID', yourElement);
})
</script>

<template>
  <div id="1111111"></div>
</template>

4. 在 App.vue 中引入组件

<script setup>
import UseOfd from './components/UseOfd.vue'
</script>

<template>
  <main>
    <UseOfd />
  </main>
</template>

5. 异步加载远程 OFD 文件

如需从服务器加载 OFD 文件,先安装 axios:

npm install axios

然后在组件中添加加载逻辑:

<script setup>
import EasyOFD from "easyofd";
import { onMounted } from 'vue'
import axios from 'axios'

let ofd;

onMounted(() => {
  let yourElement = document.getElementById("1111111");
  ofd = new EasyOFD('myofdID', yourElement);

  // 从远程服务器加载 OFD 文件
  axios.get('http://your-server/files/document.ofd', { responseType: 'blob' })
    .then(response => {
      const blob = new Blob([response.data], { type: 'application/octet-stream' });
      ofd.loadFromBlob(blob);
    })
    .catch(error => {
      console.error('获取文件失败:', error);
    });
})
</script>

注意:远程加载需要服务器配置 CORS 跨域策略,本地调试环境无法直接加载远程文件。

方式二:纯 HTML 中使用

直接在 HTML 文件中引入 JS 文件即可:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>EasyOFD 示例</title>
</head>
<body>
  <div id="container"></div>

  <!-- 引入依赖库 -->
  <script src="https://your-cdn/jszip.min.js"></script>
  <script src="https://your-cdn/x2js.js"></script>
  <script src="https://your-cdn/jb2.js"></script>
  <script src="https://your-cdn/opentype.js"></script>

  <!-- 引入 EasyOFD -->
  <script src="./easyofd.js"></script>

  <script>
    // 创建实例
    const ofd = new EasyOFD('myofdID', document.getElementById('container'));
  </script>
</body>
</html>

API 说明

方法 说明
new EasyOFD(id, parent) 创建实例,id 为实例标识,parent 为挂载 DOM 元素
loadFromBlob(file) 加载 OFD 文件(File 或 Blob 对象)
FirstPage() 跳转到第一页
PrePage() 上一页
NextPage() 下一页
LastPage() 跳转到最后一页
ZoomIn() 放大
ZoomOut() 缩小
FitWidth() 适应宽度
FitPage() 适应页面
Print() 打印文档
SetViewMode(mode) 设置视图模式:'single'(单页)、'continuous'(连续)、'double'(双页)

五、总结与展望

EasyOFD 作为一个纯前端的 OFD 渲染引擎,已经实现了 GB/T 33190-2016 标准的核心功能,能够满足大多数 OFD 文档的浏览器预览需求。

当前已实现的功能:

  • OFD 文件解析与渲染
  • 多页连续浏览与虚拟滚动
  • 缩放、翻页、视图模式切换
  • 文字选择与复制
  • 打印功能
  • 电子印章支持

未来优化方向:

  • 完善底纹(Pattern)和裁剪(Clip)渲染
  • 支持大纲(Outline)和书签(Bookmark)导航
  • 优化 MM→PX 坐标转换逻辑的统一性
  • 增加更多测试用例覆盖边缘场景

EasyOFD 采用 Apache 2.0 开源协议,欢迎对 OFD 标准感兴趣的开发者参与贡献。如果您在使用过程中遇到问题或有改进建议,欢迎提交 Issue 或 Pull Request。


关键词:OFD, GB/T 33190-2016, JavaScript, Canvas, 浏览器渲染, 电子文档, 开源库

更多推荐