纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

c#实现ofd文件转图片功能 (附执行程序)

源之缘   2020-01-30 我要评论

前言 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 string ID { get; set; }
        public PageLayer ParentLayer { get; set; }
        public string PageFileLoc => ParentLayer.ParentPage.PageFileLoc;

        XmlNode _xmlNode;

        public string Boundary { get; set; }
        public string CTM { get; set; }

        public OfdClipsGroup ClipsGroup { get; set; }

        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 PointF BoundaryLocation { get; set; }
        public SizeF BoundarySize { get; set; }

        public Matrix ObjectTransform { get; protected set; }

        public Graphics VisualGraphics { get; set; }

        public PageObject PageObject { get; protected set; }
        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 1;

                float result = ObjectTransform.Elements[0];
                return result;
            }
        }

        public double YZoomRate
        {
            get
            {
                if (ObjectTransform == null)
                    return 1;

                float result = ObjectTransform.Elements[4];
                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标准吃透建立相应显示模型按部就班的实现转图功能只有这样程序的功能才是自主可控、效率采有保证


相关文章

猜您喜欢

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式