开放代码社区 › OFD Reader & Writer
OFD Reader & Writer
数据与可视化JavaOFD Reader & Writer 在使用OFDRW前,请务必悉知 《OFD Reader & Writer 免责声明 / Disclaimer》 ! 若clone和文档预览存在困难,请移步 Talk is cheap,Show me the code. ——Linus Torvalds OFD Reader & Writer 开源的OFD处理库,支持文档生成、数字签名、文档保护、文档合并、转换、导出等功能。 本项目采用MIT许可,请尊重开源项目作者,在软件中附带OFDRW开源软件许可, 在遵守开源协议前提下可免费商业化使用 。
仓库地址
https://gitee.com/ofdrw/ofdrw.gitREADME
# OFD Reader & Writer
  [](./LICENSE)
⚠️ 在使用OFDRW前,请务必悉知 [***《OFD Reader & Writer 免责声明 / Disclaimer》***](https://gitee.com/ofdrw/ofdrw/blob/master/DISCLAIMER.md)!
> 若clone和文档预览存在困难,请移步 [https://gitee.com/ofdrw/ofdrw](https://gitee.com/ofdrw/ofdrw)
**Talk is cheap,Show me the code. ——Linus Torvalds**
<p align="center">
<img width="275" height="275" src="https://web-code-img.oss-cn-shanghai.aliyuncs.com/readme/3e495a367ae76a39cb8bc7fc.png">
</p>
OFD Reader & Writer 开源的OFD处理库,支持文档生成、数字签名、文档保护、文档合并、转换、导出等功能。
本项目采用[MIT许可](https://gitee.com/ofdrw/ofdrw/blob/master/LICENSE),请尊重开源项目作者,在软件中附带OFDRW开源软件许可,**在遵守开源协议前提下可免费商业化使用**。
根据[《GB/T 33190-2016 电子文件存储与交换格式版式文档》](https://gitee.com/ofdrw/ofdrw/blob/master/GBT_33190-2016_电子文件存储与交换格式版式文档.pdf)标准实现版式文档OFD库(含有书签)。
项目采用Maven模块管理,各模块如下:
- [**ofdrw-core**](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-core) OFD核心API,参考[《GB/T 33190-2016 电子文件存储与交换格式版式文档》](https://gitee.com/ofdrw/ofdrw/blob/master/GBT_33190-2016_电子文件存储与交换格式版式文档.pdf)实现的基础数据结构。
- [**ofdrw-font**](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-font) 生成OFD字体相关。
- [**ofdrw-layout**](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-layout) OFD布局引擎库,用于文档构建和渲染。
- [**ofdrw-pkg**](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-pkg) OFD文件的容器,用于文档的打包。
- [**ofdrw-reader**](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-reader) OFD文档解析器,用于OFD的反序列化以及签名签章。
- [**ofdrw-sign**](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-sign) OFD文档数字签章。
- [**ofdrw-gm**](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-gm) 用于支持签章模块需要的国密电子签章数据结构。
- [**ofrw-crypto**](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-crypto) 用于实现《GM/T 0099-2020 开放版式文档密码应用技术规范》对OFD的密码相关功能。
- [**ofdrw-gv**](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-gv) OFDRW 所有模块所共用的全局变量。
- [**ofdrw-converter**](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-converter) OFD文档转换(格式迁移用,**不建议用于预览**,预览见下方 OFDRW 可视化工具链)。
- [**ofdrw-tool**](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-tool) OFD文档工具,文档合并、裁剪、重组、混合。
- [**ofdrw-archive**](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-archive) OFD-A 档案模块,依据 GB/T 42133-2022 实现 OFD 文件的合规检查和去技术化转换。
- [**ofdrw-graphics2d**](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-graphics2d) 实现了AWT Graphics2D接口,生成OFD文档内容。
- [**ofdrw-full**](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-full) 上述所有模块整合包,用于简化依赖引入。
注:
- 您可以根据需求裁剪模块优化程序体积。
- 您可以仅引用`ofdrw-core`中定义的数据结来构建属于您自己的OFD库,就像[ofdrw-graphics2d](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-graphics2d)那样。
## OFDRW 可视化工具链 ***New***
[**ofdrw-viewer**](https://github.com/ofdrw/ofdrw-viewer) 是 OFDRW 系列项目之一,由一组可独立使用的 OFD 预览与渲染库、组件构成,为开发者补齐 OFD 处理链路的最后一环:
- [**ofdrw-viewer-ui**](https://github.com/ofdrw/ofdrw-viewer/tree/main/packages/ofdrw-viewer-ui) HTML5 OFD 阅读器组件,可嵌入业务系统实现在线预览。
- [**ofdrw-viewer-engine**](https://github.com/ofdrw/ofdrw-viewer/tree/main/packages/ofdrw-viewer-engine) 渲染引擎库,支持浏览器 / Node.js / 小程序,可绘制到 Canvas 或导出图片。
- [**ofdrw-viewer-cli**](https://github.com/ofdrw/ofdrw-viewer/tree/main/packages/ofdrw-viewer-cli) 终端图片导出工具,支持 PNG / JPEG / WebP。
- [**ofdrw-viewer-crypto**](https://github.com/ofdrw/ofdrw-viewer/tree/main/packages/ofdrw-viewer-crypto) 加密文档解密、电子印章解析与签名验证。
👉 [在线体验 https://ofdrw.github.io/ofdrw-viewer/index.html](https://ofdrw.github.io/ofdrw-viewer/index.html)
> OFDRW 负责 OFD 的生成、编辑与解析,ofdrw-viewer 负责预览与可视化,两者共同构成完整的 OFD 处理链路。**预览 OFD 无需转换**,本项目的转换模块仅用于格式迁移。
## QuickStart
Maven项目引入依赖
```xml
<dependency>
<groupId>org.ofdrw</groupId>
<artifactId>ofdrw-full</artifactId>
<version>2.5.0</version>
</dependency>
```
**OFDRW 将持续保证API的向下兼容,您可以放心的升级OFDRW库至最新版本。**
> - 若您没有采用Maven管理项目,请参阅项目中`pom.xml`文件中的依赖,手动解决三方依赖包问题。
> - 若出现NoClassFound等错误,请检查相关包是否存在冲突。
如何生成一份OFD文档,如何把大象放入冰箱?
```java
public class HelloWorld {
public static void main(String[] args) throws IOException {
Path path = Paths.get("HelloWorld.ofd");
try (OFDDoc ofdDoc = new OFDDoc(path)) {
Paragraph p = new Paragraph("你好呀,OFD Reader&Writer!");
ofdDoc.add(p);
}
System.out.println("生成文档位置: " + path.toAbsolutePath());
}
}
```
效果如下:

- [文档生成API示例](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-layout/src/test/java/org/ofdrw/layout/OFDDocTest.java)
- [文档布局示例](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-layout/src/test/java/org/ofdrw/layout/LayoutTest.java)
- [Canvas示例](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-layout/src/test/java/org/ofdrw/layout/element/canvas/DrawContextTest.java)
- [文字抽取示例](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-reader/src/test/java/org/ofdrw/reader/ContentExtractorTest.java)
- [段落布局示例](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-layout/src/test/java/org/ofdrw/layout/ParagraphLayoutDemo.java)
- [文档编辑示例](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-layout/src/test/java/org/ofdrw/layout/DocEditDemos.java)
- [数字签名清理示例](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-sign/src/test/java/org/ofdrw/sign/SignCleanerTest.java)
📚 相关文档目录:
- [OFD R&W 布局设计](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-layout/doc/layout/README.md)
- [OFD R&W 扩展 自定义元素](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-layout/doc/customelement/README.md)
- [OFD R&W 基于Canvas文档内容生成](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-layout/doc/canvas/README.md)
- [OFD R&W 签名签章快速入门](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-sign/doc/quickstart/README.md)
- [OFD R&W 加密 完整性保护协议](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-crypto/README.md)
- [OFD R&W 转换OFD/OFD导出 ](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-converter/README.md)(**不建议用于预览**)
- [OFD R&W 字形数据解析](https://gitee.com/ofdrw/ofdrw/blob/master/ofdrw-converter/src/main/java/org/ofdrw/converter/font/README.md)
- [OFD R&W 文档合并](https://gitee.com/ofdrw/ofd