OFD文件解析流程(转)

OFD解析数据流程分享


最近接到公司任务,应客户要求要做ofd格式文件的电票识别。刚接到任务的时候我对于ofd格式文件知道的少之甚少。之前只是听到同事提起过这样的一种格式。在我当时的认知里就单纯的知道他是"中国版的PDF"。对于他的底层实现和用途一无所知。所以我接到任务的时候就着手规划解决流程。

  1. 先了解ofd底层实现,解析构造文件
  2. 熟悉构造文件的实现原理,根据文件特性提取数据
  3. 结构化数据,并根据数据特点重构造。


1. ofd文件特性


简短的说一下ofd文件吧,想详细了解的建议去看一下电子文件存储与交换 板式文档。需要的可以私信我。
OFD格式是我国自bai主可控的电子文件版式文档du格式。我有时候会跟zhi别人解释国产PDF。

在OFD格式产生之前,dao电子文件存档格式并没有统一的国家或行业标准,档案工作中普遍采用DOC、WPS、PPTX等流式文件格式。内容易更改、转移过程存在安全隐患,并不符合电子文件长期保存要求。

一些格式依赖非自主可控技术,使用和服务都受限于外部厂商和技术,存在安全隐患。格式标准不公开,私有版式文档的格式解析、标准解释掌握在国外企业手中,文档信息资源的保密性存在隐患。

OFD格式优势

1 产权属于自主产权

2 具有便携性:文件小,可压缩比率大。测试显示生成的文件体量比PDF还要小。

3 具有开放性:易于入门,对于使用者来说更具开放性。

4 具有扩展性:预留了可扩展入口和自定义标引,设置了非接触式引用机制,为特性化提供支持。

5 呈现效果与设备无关,在各种设备上阅读、打印或印刷时,版面固定、不跑版。

6 应用广泛:无论是电子商务、电子公务,还是信息发布、文件交换,档案管理等都需要版式文档的技术支持。

据我了解,现在国内很多档案馆已经开始用OFD版式文档存档了,毕竟响应国家号召
OFD采用的是"容器+文档"的方式描述和存储数据,容器是一个虚拟存储系统,将各类数据描述文件聚合起来,并提供相应的访问接口和数据压缩方法。


现在我们要知道OFD文件层次组织结构


在我看来ofd文件最为重要的一点是底层通过xml来进行构造。使得板式固定和文件的稳定。既然是xml来实现那我们就可以通过xml入手。
新手的可以把ofd文件后缀改为zip(ofd本身就是压缩文件,文件名不是文件的一部分,是文件系统的一部分。文件名只是文件在文件系统中的映射标记,文件本身并不包含文件名)在进行解压就可以看到文件结构了

https://img-blog.csdnimg.cn/20210520143512337.png
OFD文件层次组织结构

OFD.XML | 文件主入口文件,一个包内存在且只存在一个OFD.xml文件,此文件名不应修改
DOC_N | 第N个文档的文件夹
Document.xml | 文档的根节点
Page_N | 第N页文件夹
Content.cml | 第N页的内容描述
PageRes.xml | 第N页的资源描述
Res | 资源文件夹
PublicRes.xml | 文档公共资源索引
DocumentRes.xml | 文档自身资源索引
Image_M.png/Font_M.ttf | 资源文件
Signs | 数字签名存储目录
Singatures.xml | 签名列表文件
Sign_N | 第N个签名/签章
Signature.xml | 签名/签章描述文件
Seal.esl | 电子印章文件
SignedValue.dat | 签名值文件

我们看到OFD.XML 为主入口文件,OFD.xml文件的结构


我们可以在主入口文件里面找到根文件(Document.xml)的相对位置,根文件里面会有我们所需的数据文件的索引。
一般来看我们简单提取文件中的数据我们只需要找到数据文件包括(文本数据及bbox的坐标,线条的坐标)在重构造了。我那示例图来说一下我们所需要的的数据。

我们在图上可以看到有"重庆增值税电子普通发票 发票代码: "这样的红色文本,还有"050001700111"这样的黑色文本,还有红色的线条。这是我们所需要的 当然还会有二维码和印章,提取方式都是一样的。我们按照前三类去提取讲解。

数据提取思路
我们根据主入口文件找到根文件在根据找到数据文件,在根据数据文件去解析数据就OK。
1.先找到主入口文件,这个当然容易因为他就在最外层并且命名不会改变。我们现在就来看一下他的内容。


我们能看到图中红框的就是根文件的相对目录。我们可以把xml文件转成json处理,这个操作不会的同学们自行百度,或者私信我。我们再来看一下这个根文件内容。

我们能看到红框1中的相对路径中的文件是上面提到的红色字体和线条的数据存放文件,红框2中的相对路径的文件是黑色字体的数据存放文件。我们解析出数据存放的文件路径那我们就可以去解析数据了。我们分别来看一下这两类数据文件内容。

我们虽然找到了这个数据文件,但是数据结构还是比较复杂的,我是通过递归去找到需要的数据。当然同学们也可以评论自己更好的方法。Boundary四位数分别代表的是 x y w h。(ofd是左上角的x,y。pdf是左下角的x,y)这样我们就可以根据计算提供了x_mix,y_mix,x_max,y_max了这样我们就可以画出bbox了。线条和红色字体也是同一道理.这样我们可以根据自己的需求去重结构化了。当然这是高度个性化的开发,所以我这边就不做陈述了。

这样我们就可以把ofd数据解析出来了,本人学识浅陋,对博大精深之ofd文件操作理论仅略知皮毛,在本文章中错谬之处在所难免,若蒙读者诸君不吝指出,将不胜感激.
2020年8月于北京
————————————————
版权声明:本文为CSDN博主「Winston.H」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013823545/article/details/108151914

你可以使用第三方库来解析OFD(Open Financial Data)文件。一个常用的Java库是Apache PDFBox,它支持解析和处理PDF文件,而OFD文件可以通过将其换为PDF格式来解析。 首先,你需要将OFD文件换为PDF格式。这可以通过使用OFD换工具来完成,例如OFD Reader(https://github.com/Trisia/ofdReader)。 一旦你将OFD文件换为PDF格式,你就可以使用Apache PDFBox来解析和提取其中的内容。你可以使用PDFBox的文档对象模型(DOM)来访问文本、图像等元素。 下面是一个简单示例,演示如何使用Apache PDFBox解析PDF文件: ```java import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; public class OFDParser { public static void main(String[] args) { try { PDDocument document = PDDocument.load(new File("path/to/your/converted/pdf/file.pdf")); PDFTextStripper stripper = new PDFTextStripper(); String text = stripper.getText(document); System.out.println(text); document.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 这个示例将打开换后的PDF文件并提取其中的文本内容。你可以根据需要进一步处理和解析这些内容。 请注意,OFD文件可能包含更复杂的结构和元素,如表格、图形等。你可能需要使用更高级的PDF处理库来处理这些元素,或者自行编写代码来解析OFD文件的结构。 希望这个示例能帮助到你开始解析OFD文件。如果你需要更详细的解析或其他功能,建议查阅相关文档或寻找更专业的OFD处理库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值