前言OFD是国家标准版式文档格式,于2016年生效。OFD文档国家标准参见《电子文件存储与交换格式版式文档》。既然是国家标准,OFD随后肯定会首先在政务系统使用,并逐步推向社会各个方面。OFD是在研究当下各类文件格式后,推出的标准,有如下优点:

1 产权属于自主产权

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

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

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

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

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

关于标准,我也要吐槽一下。OFD标准是国内几家专业的电子文档处理公司参与起草的;标准文档(注:以下用”标准”特指OFD标准)只有126页,在我看来,标准对技术细节的描述过于简单,没有一定的技术背景很难看懂。与此形成鲜明对比的是pdf标准,有1000多页。我在网上也没找到文字版的标准,特别不利于阅读和参考。

我最近一直研究ofd标准,试图写一款阅读器,已初有成果,界面如下:

本文就把我开发的过程做简单介绍。

OFD标准简介

简而言之,OFD存储是采用压缩技术,描述采用XML格式。这一点与微软的word文档(docx)格式很类似。标准可能参考了微软的处理方式;在技术上也要实事求是,国标这种格式不是独创和领先的。将OFD格式文件解压后,会看到如下目录和文件:

文件中会包括资源文件(图片、字体库等)。XML会对资源存放,图元(文字、图像等)显示做描述,阅读软件会根据这些描述呈现出一致的显示效果。

开发OFD阅读软件步骤

国内流行的ofd阅读软件应该是福昕和数科开发的,这两款我都用过。我还要吐槽一下:

1)福昕阅读器帮助文档是ofd格式,但是无法用数科的阅读器打开。

2)有些ofd文档中xml标记,在标准中找不到,是某些公司独创的?

这些软件都是用C++开发的,用到了QT。同样情况下,相比于C#,C++开发软件难度肯定会大增。在windows平台开发界面,WPF应该是最好的库了。WPF虽然出现十几年了,大家好像对此还很陌生。主要现在是BS的天下;不是WPF不够好,是生不逢时。

1 对OFD文件解压缩

OFD文件其实就是压缩文件,解压后的文件也有目录结构。该模块的功能是获取每个文件的路径和数据。

usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.IO.Compression;usingSystem.Linq;namespaceWpfOfdReader.OfdFileType

{classOfdFileReader

{

ZipArchive _zipArchive;public void ReadZipFile(stringfileName)

{

_zipArchive=ZipFile.OpenRead(fileName);

}public voidClose()

{if (_zipArchive != null)

_zipArchive.Dispose();

}public ListAllFileItem

{get{return _zipArchive.Entries.Select(o => newOfdFileItemInfo(o)).ToList();

}

}privateZipArchiveEntry GetArchiveEntry(ZipFilePath path)

{foreach (ZipArchiveEntry entry in_zipArchive.Entries)

{if (entry.FullName ==path.FulleName)

{returnentry;

}

}return null;

}public static byte[] GetFileBuffer(ZipArchiveEntry entry)

{

List listBuffer = new List();using (Stream s =entry.Open())

{while (true)

{byte[] buffer = new byte[10];int n = s.Read(buffer, 0, buffer.Length);if (n <= 0)break;if (n ==buffer.Length)

{

listBuffer.Add(buffer);

}else{

Array.Resize(refbuffer, n);

listBuffer.Add(buffer);break;

}

}

}int totalLen = 0;

listBuffer.ForEach(o=> totalLen +=o.Length);byte[] result = new byte[totalLen];int index = 0;foreach (byte[] buffer inlistBuffer)

{

Buffer.BlockCopy(buffer,0, result, index, buffer.Length);

index+=buffer.Length;

}returnresult;

}

}

}

2 找到需要展示的page

顺着路线 OFD.xml --> Document.xml --> Pages,找到最终需要展示的page页。Page页包含三类节点:PathObject、ImageObject,暨对应标准中的三类图元。需要对这三类节点建模。这三个类共同继承父类PageObject。所有的图元都有绘制区域、坐标变换、裁剪等共性,所有这些由PageObject类处理。

3 创建WPF显示模型

图像精确定位需要用到Canvas控件作为容器。绘制大量图形需要用到轻量级绘制模型DrawingVisual。在此基础上,派生了绘制基础模型OfdVisual,此模型对应PageObject。

有三种类型绘制对象OfdVisualText、OfdVisualPath、OfdVisualImage,派生自OfdVisual。分别处理三种图元数据。所有的绘制操作在函数

public override void Show(bool visiable, bool even = false);

对应文本,绘制函数如下:

绘制前,需要对当前坐标做变换、旋转、剪切等操作。

最近又对程序完善了,增加缩略图和公文索引:

后记 编写阅读器类软件的关键是建模。首先读懂标准,对标准中描述的图元做归类分析,并建立起相应的显示模型。本人做WPF开发很多年了,感觉用WPF开发这类软件并不是非常的难。相比于QT,采用wpf开发有很多优势。如果要完整实现OFD标准,还需要大量的开发,我会逐步完善该软件的功能。

特别说明

ofd阅读器开发语言为c#,具有完全自主产权,没有使用第三方ofd开发包。可以根据你的需求快速定制开发。本阅读器还在开发完善阶段,如有任何问题,可以联系我QQ:13712486。博客:https://www.cnblogs.com/yuanchenhui/

原文出处:https://www.cnblogs.com/yuanchenhui/p/ofdreader.html

ofd阅读器qt_采用WPF技术,开发OFD电子文档阅读器相关推荐

  1. 采用WPF技术,开发OFD电子文档阅读器

    前言 OFD是国家标准版式文档格式,于2016年生效.OFD文档国家标准参见<电子文件存储与交换格式版式文档>.既然是国家标准,OFD随后肯定会首先在政务系统使用,并逐步推向社会各个方面. ...

  2. OFD电子文档阅读器功能说明(采用WPF开发,永久免费)

    特别说明 ofd阅读器开发语言为c#,具有完全自主产权,没有使用第三方ofd开发包.可以根据你的需求快速定制开发.本阅读器还在开发完善阶段,如有任何问题,可以联系我.博客:https://www.cn ...

  3. 采用WPF进行开发的酒店管理系统源码

    ASP.NET酒店管理系统源码(WPF) 开发语言:C# 数据库: Access 开发工具:VS2013 源码免费分享 一.源码特点 采用WPF进行开发的酒店管理系统源码,界面相当美观,功能齐全. 二 ...

  4. 计算机中官方文档阅读方法,利用Word阅读电子文档-word技巧-电脑技巧收藏家

    利用Word阅读电子文档 时下随着大量免费电子邮件杂志的涌现,中文读书软件逐渐流行起来,如ReadBook.e-book之类.这些读书软件有一个普遍的共同点:就是支持多种格式的文档,并且可以自由设定自 ...

  5. 使用微软WPF技术开发产品优势究竟在那里

    2008年在世界经济历史上是一个不平凡的一年,在这一年中,美国的五大投资银行有两家破产.金融危机席卷全球,美国的失业率在过去的一年从4%飙升到了10%,有些城市的失业率甚至高达20%:加拿大的就业数字 ...

  6. 关于好易网采用GWT技术开发网站的总结

    原文地址: http://diaoge.iteye.com/blog/359296 采用GWT开发网站的优势:  GWT开发网站,采用了java语言的优势编写前后端的程序,可以有很好的继承,多态,覆盖 ...

  7. 采用web技术开发PC应用

    web应用相较于原生应用,在代码开发调试时的便利就不多做解释了.这里我们直入主题,今天我们要学习的是采用node-webkit来开发桌面应用.顾名思义,node-webkit是由node和webkit ...

  8. 下载的电子发票打不开?ofd电子文档你可以这样做

    如今随着线上支付的普及,发票也有原来的纸质改为电子版,可在我们刚适应PDF电子发票的使用后,发票又改为专用的OFD版,于是很多人都会苦恼下载后的电子发票打不开,教你几招让ofd电子发票也像PDF一样好 ...

  9. django开源电子文档管理系统_基于 Python 开发的在线文档系统

    MarkDown 编辑,快速书写:类 Gitbook,简洁阅读:后台管理. 州的先生(zmister.com)自用并完全开源.基于 Python 编写的文档写作系统. MrDoc 拥有以下特点: 站点 ...

  10. java读取ofd文档内容_ofd电子文档内容分析工具(分析文档、签章和证书)

    前言 ofd是国家文档标准,其对标的文档格式是pdf.ofd文档是容器格式文件,ofd其实就是压缩包.将ofd文件后缀改为.zip,解压后可看到文件包含的内容. ofd文件分析工具下载: ofd文件解 ...

最新文章

  1. r语言中正定矩阵由于误差不正定_Kalman滤波在MOT中的应用(一)——理论篇
  2. WINCE下的MINGW交叉编译环境下内存崩溃地址的查找方法。
  3. 其中一个页签慢_渭南提升一个大专学历的有效方法
  4. linux 调用外部变量,sed当中使用变量替换以及执行外部命令
  5. windows 2008 r2 AD域控服务器部署
  6. Exynos4412开发板更换开机logo图片
  7. 电脑遇到脱机状态怎么解除?
  8. Android Studio 4.1一键生成代码Template
  9. /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o: In function `_start‘: (.text+0x20
  10. java读取txt文件内容_Java读取TXT文件内容的方法
  11. Hive实现环比和同比
  12. Linux中将4块10T新硬盘合并成一个,挂载到Resource目录下
  13. Linux中阶—远程接入sshsftp(八)
  14. python实现网络与IP地址计算
  15. 一位特殊的中国特斯拉车主,让马斯克感动了
  16. HDU4544 湫湫系列故事――消灭兔子
  17. 贝加莱PLC编程总结
  18. centos安装Trojan安全上网
  19. c++ 四元数转欧拉角
  20. finally和return执行的先后顺序

热门文章

  1. 活动报名 | 无限视觉生成模型NUWA-Infinity,可生成超3万像素清明上河图
  2. python爬取酷狗音乐_python 爬虫 爬取酷狗音乐
  3. 彻底搞懂 python 中文乱码问题_彻底搞懂 python 中文乱码问题(深入分析)
  4. Pensieve Multi_agent代码详解以及A3C强化学习代码详解
  5. C# 连接本地数据库
  6. 关于伪分布式hadoop集群及HBase安装的一些记录(基于林子雨老师的大数据软件安装和基础编程)
  7. kali虚拟机安装教程
  8. gridview隐藏列的方法
  9. 恋物志(二):独居者的智能生活指南
  10. 前端H5面试题(vue为主)