c#实现ofd文件转图片功能 (附执行程序)
前言 ofd文件的作用就是保证信息能如实的存储、传递、显示。保证ofd文件的真实性靠的是签名;ofd 的显示需要专用软件。ofd标准是新的国家标准,应用范围远不如pdf;现有浏览器不能解析ofd、支持ofd显示的软件也寥寥无几。ofd转图片程序下载。
专用软件读取ofd过程包括对ofd文件解压缩、分析每页的文字和图元、关联对应的资源、解析签章等复杂操作。将ofd文件转成图片,可以避免这些重复的操作;ofd转成图片后,就可以方便的在浏览器、各类app中显示。所以,ofd转图片是ofd系统中必不可少的一个功能。
ofd转图片实现思路
ofd转图片没有捷径可走。实现ofd转图片,就是在图片上输出文字、图元、各类曲线等,这些操作和输出到屏幕上并没有多大区别。ofd转图片和ofd阅读器在技术上是有很大重合的。要完成ofd转图片,需要你对ofd文件有充分的理解。参见我的文章《采用WPF技术,开发OFD电子文档阅读器》。
本文ofd转图片功能没用到wpf相关类,而是使用了System.Drawing暨GDI+。.net core 3.0 已经实现了System.Drawing;理论上,本文所涉及的代码可以很方便的移植到.net core下,在linux下实现ofd转图只有一步之遥。

实现ofd转图片包括以下几个步骤:
1 创建ofd页面信息模型
ofd页面由文本、图片、曲线等组成。首先将页面解析成各类object,它们的父类为PageObject:
public class PageObject
{
public void SetPageObject(PageLayer layer, XmlNode xmlNode)
{
_xmlNode = xmlNode; ID = XmlHelper.GetXmlAttributeValue(xmlNode, "ID");
ParentLayer = layer; Boundary = XmlHelper.GetXmlAttributeValue(xmlNode, "Boundary");
CTM = XmlHelper.GetXmlAttributeValue(xmlNode, "CTM"); foreach (XmlNode childNode in xmlNode.ChildNodes)
{
if (childNode.Name == OfdClipsGroup.XML_Name)
{
ClipsGroup = OfdClipsGroup.FromXml(childNode);
break;
}
} } public string GetAttributeValue(string name)
{
string result = XmlHelper.GetXmlAttributeValue(_xmlNode, name);
return result;
} }
从此类派生出 PageObjectText、PageObjectPath、PageObjectImage等,代表ofd页面文本、曲线、图片等类型信息。
2 由信息模型PageObject 创建显示模型OfdVisual;
信息模型包含了显示需要的各类信息,显示模型就是利用这类信息显示。显示模型的父类为OfdVisual:
public class OfdVisual
{
public OfdVisual()
{
} public virtual void Show(bool visiable, bool even = false)
{ } public virtual void ShowSelect(bool visiable, Rectangle selectRegion, bool even = false)
{ } public string PageItemId
{
get
{
if (PageObject == null)
return string.Empty;
return PageObject.ID;
}
}public PointF ToPageLocation(PointF pt)
{
return new PointF(pt.X + BoundaryLocation.X, pt.Y + BoundaryLocation.Y);
} protected void PutBoundary()
{
VisualGraphics.TranslateTransform(BoundaryLocation.X, BoundaryLocation.Y);
VisualGraphics.SetClip(ClipRect);
} GraphicsState graphicsState; protected void DrawSave()
{
graphicsState = VisualGraphics.Save();
} protected void DrawRestore()
{
VisualGraphics.Restore(graphicsState);
} protected void PutTransform()
{
if (ObjectTransform != null)
{
VisualGraphics.MultiplyTransform(ObjectTransform);
}
} public double XZoomRate
{
get
{
if (ObjectTransform == null)
return ; float result = ObjectTransform.Elements[];
return result;
}
} public double YZoomRate
{
get
{
if (ObjectTransform == null)
return ; float result = ObjectTransform.Elements[];
return result;
}
} }
有三类显示模型OfdVisualText、OfdVisualImage、OfdVisualPath等。
3 创建bitmap
根据页面大小创建bitmap,由bitmap获取Graphics。后面的显示操作就是利用Graphics各类函数处理。
_ofdBitmap = new Bitmap((int)(width* scale), (int)(height* scale)); Graphics = Graphics.FromImage(_ofdBitmap);
ofd转图片程序功能说明

操作步骤:选择生成图片的缩放比例,点击“ofd转图片”按钮,选择ofd文件。转成图片后,ofd文件在左侧列表显示,点击列表中文件,右侧显示对应的图片。程序底部为日志,显示ofd文件的页数、转换耗时等信息。
为了方便别的程序调用,程序可以做成web 服务形式,对外接口为web api。客户端传入ofd文件,输出为图片。
后记 对于ofd转图片,网上有一种方法是采用虚拟打印。这是一种捷径,也是没有办法的办法。但是采用虚拟打印,必须依赖第三方ofd阅读器,使用不方便,输出效果也增加了不确定性。要实现ofd转图片,必须对ofd标准吃透,建立相应显示模型,按部就班的实现转图功能;只有这样,程序的功能才是自主可控、效率才有保证。
c#实现ofd文件转图片功能 (附执行程序)的更多相关文章
- java开发在线下载功能,自动打开浏览器下载功能下载网络文件或图片
因为业务的需要,公司产品要求商品详情页面有个下载的功能 找了很多的方法,发现有的需要打开一个新窗口,而且在某些浏览器上不适用,所以继续寻找更好的方法 跟同事沟通后发现他那里有个下载的方法,不过是C#写 ...
- 刚刚做了个文件上传功能,拿来分享一下!(MVC架构及传统架构通用)
文件上传无论在软件还是在网站上都十分常见,我今天再把它拿出来,讲一下,主要讲一下它的设计思想和实现技术,为了它的通用性,我把它做在了WEB.Service项目里,即它是针对服务器的,它的结构是关联UI ...
- [经验] Win7减肥攻略(删文件不删功能、简化优化系统不简优化性能)
[经验] Win7减肥攻略(删文件不删功能.简化优化系统不简优化性能) ☆心梦无痕☆ 发表于 2014-1-24 11:15:04 https://www.itsk.com/thread-316471 ...
- MVC5:使用Ajax和HTML5实现文件上传功能
引言 在实际编程中,经常遇到实现文件上传并显示上传进度的功能,基于此目的,本文就为大家介绍不使用flash 或任何上传文件的插件来实现带有进度显示的文件上传功能. 基本功能:实现带有进度条的文件上传功 ...
- FusionChart 导出图片 功能实现(转载)
FusionChart 导出图片 功能实现(转载) http://www.cnblogs.com/jiagoushi/archive/2013/02/05/2893468.html 题目:精美Fusi ...
- java Html2Image 实现html转图片功能
//java Html2Image 实现html转图片功能 // html2image HtmlImageGenerator imageGenerator = new HtmlImageGenera ...
- 百度UEditor编辑器关闭抓取远程图片功能(默认开启)
这个坑娘的功能,开始时居然不知道如何触发,以为有个按钮,点击一下触发,翻阅了文档,没有发现,然后再网络上看到原来是复制粘贴非白名单内的图片到编辑框时触发,坑娘啊............... 问题又来 ...
- Web文件(图片)上传方法
在开放Web应用程序的时候经常会遇到图片或者是文件上传的模块,这里就是该模块的实现的后台方法 上传图片方法 /// <summary> /// 功能:上传图片方法 /// </sum ...
- nodejs 实现简单的文件上传功能
首先需要大家看一下目录结构,然后开始一点开始我们的小demo. 文件上传总计分为三种方式: 1.通过flash,activeX等第三方插件实现文件上传功能. 2.通过html的form标签实现文件上传 ...
随机推荐
- 异步加载css 和 谷歌浏览器各实用小工具介绍
异步加载css资源 加开页面首屏显示速度使我们前端一直在追求的目标,而css资源在这些优化中同样也是不可或缺的. 一个网站可能有一部分css资源是必须的,他需要在页面渲染完之前就被加载完,并和html ...
- 22.XML
转载:https://www.cnblogs.com/yuanchenqi/article/5732581.html xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用 ...
- Excel快速填充
利用单元格右下角填充句柄进行填充 然后选择快速填充 利用数据面板的快速填充功能(ctrl+e) 年月日三列不能同时填充 只能够一列一列的填充 类别取第一列 级别取第二列 但是由于第一个的编号有两个“1 ...
- asp.net core 3.x Endpoint终结点路由1-基本介绍和使用
前言 我是从.net 4.5直接跳到.net core 3.x的,感觉asp.net这套东西最初是从4.5中的owin形成的.目前官方文档重点是讲路由,没有特别说明与传统路由的区别,本篇主要介绍终结点 ...
- Google被墙怎么办?
Google被墙怎么办? 1 声明 请小伙伴们遵守法律法规,我们只是为了更好的查询学习资料. 想使用Google查询相关资料 想使用Google账号管理收藏夹 想使用Google商店安装软件 == 2 ...
- javascript数组大全(一张图列出数组的所有方法)
把所有数组的方法列在了一张图上,为了自己温故一下,也为了以后忘记时好查阅. 如果大家在上面查阅方法,可以找到对应的方法名,看前面简单的注释,还是不能明白的话,可以看一下官网说明,地址给大家列出来,MD ...
- 微服务统计,分析,图表,监控一体化的HttpReports项目在.Net Core 中的使用
简单介绍 HttpReports 是 .Net Core 下的一个Web项目, 适用于WebAPI,Ocelot网关应用,MVC项目,非常适合针对微服务应用使用,通过中间件的形式集成到您的项目中,可以 ...
- Nginx 核心配置详解
目录 Nginx 核心配置详解 Nginx 四层访问控制: Nginx账户认证功能: 自定义错误页面: 自定义访问日志: 检测文件是否存在: 长连接配置: 作为下载服务器配置: 作为上传服务器: 其他 ...
- python线性数据结构
1.栈(Stack)(后进先出) 栈的实现: class Stack: def __init__(self): self.items = [] def isEmpty(self): return se ...
- 浅析PHP类的自动加载和命名空间
php是使用require(require_once)和include(include_once)关键字加载类文件.但是在实际的开发工程中我们基本上不会去使用这些关键字去加载类. 因为这样做会使得代码 ...