JAVA:OFD Reader Writer 开源库技术解析

news2024/9/24 15:27:16

1、简述

OFD Reader & Writer 是一个由开源社区推动的 OFD 文件处理库,它旨在提供对 OFD 格式文件的读取和写入功能。这一开源项目为开发者提供了强大而灵活的工具,使得在应用程序中处理和生成 OFD 文件变得更加容易和高效
开源地址:https://toscode.mulanos.cn/ofdrw/ofdrw

  • OFD 文件读取
    OFD Reader & Writer 提供了高效的 OFD 文件读取功能,能够准确解析 OFD 文件的结构和内容,以便进行后续的处理和分析。

  • OFD 文件写入
    除了读取,OFD Reader & Writer 还支持 OFD 文件的生成和写入。开发者可以通过这个库创建、编辑并生成符合 OFD 标准的文件。

  • 高度模块化
    OFD Reader & Writer 设计为高度模块化,提供了丰富的 API 接口,使得开发者可以根据需要选择性地使用其中的功能,保持了库的轻量性和灵活性。

  • 开放扩展性
    这一库注重开放性,支持插件和扩展,使得开发者能够根据自身需求轻松扩展功能,满足不同场景的需求。

2、模块

根据《GB/T 33190-2016 电子文件存储与交换格式版式文档》标准实现版式文档OFD库,项目采用Maven模块管理,各模块如下:

  • ofdrw-core OFD核心API,参考《GB/T 33190-2016 电子文件存储与交换格式版式文档》实现的基础数据结构。
  • ofdrw-font 生成OFD字体相关。
  • ofdrw-layout OFD布局引擎库,用于文档构建和渲染。
  • ofdrw-pkg OFD文件的容器,用于文档的打包。
  • ofdrw-reader OFD文档解析器,用于OFD的反序列化以及签名签章。
  • ofdrw-sign OFD文档数字签章。
  • ofdrw-gm 用于支持签章模块需要的国密电子签章数据结构。
  • ofrw-crypto 用于实现《GM/T 0099-2020 开放版式文档密码应用技术规范》对OFD的密码相关功能。
  • ofdrw-gv OFDRW 所有模块所共用的全局变量。
  • ofdrw-converter OFD文档转换。
  • ofdrw-tool OFD文档工具,文档合并、裁剪、重组。
  • ofdrw-graphics2d 实现了AWT Graphics2D接口,生成OFD文档内容。
  • ofdrw-full 上述所有模块整合包,用于简化依赖引入

3、应用

这一库不仅具备对 OFD 文件的读取功能,还提供了强大的写入功能,为开发者提供全面的 OFD 文件处理解决方案。

3.1 引用

通过Maven项目引用相关依赖:

<dependency>
  <groupId>org.ofdrw</groupId>
  <artifactId>ofdrw-full</artifactId>
  <version>2.2.6</version>
</dependency>

备注:OFDRW 将持续保证API的向下兼容,您可以放心的升级OFDRW库至最新版本。

3.2 创建

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());
    }
}

在这里插入图片描述

3.3 解析

通过OFD文件路径,将当前文件解析,并且获取相关OFD文件信息:

public static OFDReader ofdParse(String ofdFilePath) throws Exception{
    Path input = Paths.get(ofdFilePath);
    return  new OFDReader(input);
}

3.4 根目录

获取解析完成的ofd根目录:

String sysAbsPath = ofdReader.getOFDDir().getSysAbsPath();

3.5 打包

在使用个过程中有时候需要修改ofd文件的内容,我们可以将他解压后,然后通过OFDRW提供的接口重新打包成OFD文件:

public static void jar(Path jarPath, Path targetFilePath) throws IOException {
   OFDDir ofdDir = new OFDDir(jarPath);
   ofdDir.jar(targetFilePath);
}

3.6 转换

在开发工程中很多文件重新去构造OFD会浪费大量的时间,我们可以轻松的从已有的PDF直接转成OFD:

public static void convertBy2D(String resourceFilePath, String targetFilePath) throws Exception{
    Path src = Paths.get(resourceFilePath);
    Path dst = Paths.get(targetFilePath);
    try (PDFConverter converter = new PDFConverter(dst)) {
        converter.convert(src);
    }
}

4、其他解决方案

4.1 HTML5

HTML5前端预览解决方案: DLTech21/ofd.js . https://github.com/DLTech21/ofd.js

  • jszip解压。
  • fast-xml-parser解析xml为json数据。
  • svg及canvas渲染实现。
  • 完全浏览器OFD页面渲染。
4.2 开源阅读器
  • 数科网维公司 . 数科OFD阅读器 . www.ofd.cn
  • Foxit . 福昕OFD . www.foxitsoftware.cn/ofd/

5、结语

OFD Reader & Writer 开源库作为一项致力于 OFD 文件处理的技术工具,通过其完整的 OFD 标准支持、高度模块化和开放扩展性等特点,为开发者提供了一种强大的 OFD 文件处理解决方案。如果你正在寻找一个全面的 OFD 文件读写库,OFD Reader & Writer 无疑是值得深入研究和应用的技术利器,为你的项目带来更高效的文件处理能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1403977.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter底部导航栏插件persistent_bottom_nav_bar的使用

flutter 框架中的 persistent_bottom_nav_bar 插件可以让我们快速实现页面底部导航栏&#xff08;也就是 bottomNavigationBar &#xff09;的布局且能拥有多样的切换效果&#xff08;包括但不限于&#xff1a;动画切换效果、中间凸起按钮效果等&#xff09; 插件网址&#xf…

网络安全全栈培训笔记(55-服务攻防-数据库安全RedisHadoopMysqla未授权访问RCE)

第54天 服务攻防-数据库安全&Redis&Hadoop&Mysqla&未授权访问&RCE 知识点&#xff1a; 1、服务攻防数据库类型安全 2、Redis&Hadoop&Mysql安全 3、Mysql-CVE-2012-2122漏洞 4、Hadoop-配置不当未授权三重奏&RCE漏洞 3、Redis-配置不当未授权…

linux更新内核

内核介绍 官网链接:https://kernel.org 内核下载库: https://mirrors.edge.kernel.org/pub/linux/kernel/ 更新软件源 rootcary:~# apt-get update rootcary:~# sudo apt-get install libncurses5-dev build-essential kernel-package flex bison libelf-dev libssl-dev 下…

通过curl访问k8s集群获取证书或token的方式

K8S安全控制框架主要由下面3个阶段进行控制&#xff0c;每一个阶段都支持插件方式&#xff0c;通过API Server配置来启用插件。 1. Authentication&#xff08;认证&#xff09; 2. Authorization&#xff08;授权&#xff09; 3. Admission Control&#xff08;准入控制&#…

数字频率合成器dds的量化性能分析matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 DDS的基本原理 4.2 DDS的量化性能分析 5.完整工程文件 1.课题概述 数字频率合成器dds的量化性能分析matlab仿真&#xff0c;分别定义累加器位宽&#xff0c;截位位宽&#xff0c;模拟DAC位宽等&…

excel学习1

直接ctrl cctrl v会报错位移选择粘贴时用123那个数字粘贴而不是ctrl V 只要结果不要公式 上面复制的为数值这里是复制的公式他们两个不一样 这个方法太麻烦了直接用格式刷&#xff0c;选择一个区域一个单元格&#xff0c;不要选择多个一刷就出来了 第一个计算后向下拖就行了&…

开发实践8_REST

一、Django REST Framework, Django View & APIView MTV模式实现前后端分离。Representational State Transfer 表现层状态转化。Representation 资源&#xff08;Resource a specific info. on net.&#xff09;具体呈现形式。ST 修改服务端的数据。修改数据 POST请求。…

【AI Agent系列】【MetaGPT】7. 一句话订阅专属信息 - 订阅智能体进阶,实现一个更通用的订阅智能体

文章目录 0. 前置推荐阅读1. 本文内容2. 解析用户指令&#xff08;分析用户需求&#xff09;2.1 完整代码及注释2.2 运行结果 3. 利用大模型写爬虫代码3.1 对html内容进行精简3.2 利用大模型写爬虫代码3.3 补充代码&#xff0c;测试本节程序3.4 运行结果及踩坑3.4.1 运行结果3.…

开始学习vue2基础篇(指令)

一、 内容渲染指令 > {{}} 模板渲染&#xff08;模板引擎&#xff09; 1. {{数据绑定}} 2. {{简单计算}} 3. {{简单逻辑运算}}&#xff08;三元运算&#xff09; 4. {{做简单 js 判断}} 注意&#xff1a;不能写语句、不能解析 html 渲染、不能放在在属性身上 > v-…

40. 组合总和 II - 力扣(LeetCode)

题目描述 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 输入示例 candidates [10,1,2,7,…

如何使用WinSCP公网远程访问本地CentOS服务器编辑上传文件

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本地与远程计…

Kubernetes operator(一)client-go篇

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列第一篇&#xff0c;主要对client-go进行学习&#xff0c;从源码阅读角度&#xff0c;学习client-go各个组件的实现原理、如何协同工作等参考视频&#xff1a;Bilibili 2022年最新k…

【MySQL进阶】锁

文章目录 锁概述全局锁语法特点 表级锁表锁意向锁 行级锁行锁间隙锁&临键锁 面试了解数据库的锁吗&#xff1f;介绍一下间隙锁InnoDB中行级锁是怎么实现的&#xff1f;数据库在什么情况下会发生死锁&#xff1f;说说数据库死锁的解决办法 锁 概述 锁机制&#xff1a;数据库…

2 - 部署Redis集群架构

部署Redis集群架构 部署Redis集群部署管理主机第一步 准备ruby脚本的运行环境第二步 创建脚本第三步 查看脚本帮助信息 配置6台Redis服务器第一步 修改配置文件启用集群功能第二步 重启redis服务第三步 查看Redis-server进程状态&#xff08;看到服务使用2个端口号为成功&#…

Java线程池七大参数详解和配置(面试重点)

一、corePoolSize核心线程数 二、maximunPoolSize最大线程数 三、keepAliveTime空闲线程存活时间 四、unit空闲线程存活时间的单位 五、workQueue线程工作队列 1、ArrayBlockingQueue FIFO有界阻塞队列 2、LinkedBlockingQueue FIFO无限队列 3、PriorityBlockingQueue V…

chapter5-使用网页爬虫取利器—Requests

上篇文章我们讲解了使用Python 自带的urllib模块来爬取我们的第一个页面。但是事实上&#xff0c;urllib在现在的互联网公司应用的并不是最多的。今天&#xff0c;我们就来介绍一下目前最为流行&#xff0c;也是最为方面的网络爬虫框架之一的Requests 。 为什么要学习Requests…

BL120AC 工业空调网关 空调协议转Modbus协议网关

随着物联网技术的迅猛发展&#xff0c;人们深刻认识到在智能化生产和生活中&#xff0c;实时、可靠、安全的数据传输至关重要。在此背景下&#xff0c;高性能的物联网数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于工业自动化和数字化工厂应用环境中。 钡铼…

基于jQuery与Spring MVC实现用户密码异步修改的实战演示

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;创建表单1、表单界面2、表单代码3、脚本代码 &#xff08;二&#xff09;后端控制器&#xff08;三&#xff09;测试代码&#xff0c;查看效果1、弹出更改密码表单2、演示更改密码操作 三、实战总结 一、实战概述 …

【Java-框架-SpringSecurity】单点登录(认证和授权)- 随笔

项目文件&#xff1b; 【1】 【2】 【3】 【4】 【5】 【6】 【7】 【8】

Redis常见类型及常用命令

目录 常见的数据类型 一、String类型 1、简介 2、常用命令 &#xff08;1&#xff09;新建key &#xff08;2&#xff09;设值取值 ​编辑 &#xff08;3&#xff09;批量操作 &#xff08;4&#xff09;递增递减 3、原子性操作 4、数据结构 二、list类型 1、list常…