zoukankan      html  css  js  c++  java
  • 思路初探:采用c#实现pdf转ofd

    前言   版式文档格式是版面呈现效果固定的电子文档格式, pdf和ofd均为板式文档格式标准;pdf板式文件占有绝对的统治地位;ofd是我国自主研发的板式文档规范,属于后起之秀。同为板式文件, 理论上可以实现互转而又能达到呈现格式完全一致。

      ofd标准晚于pdf标准将近20年,ofd标准采用吸纳了软件行业近年来的一些先进技术和通用做法;ofd和pdf虽均为板式文件,但是两个标准对板式文件的描述差别还是非常大的。市面上的板式文件大部分为pdf,如果能实现pdf转ofd,就解决了ofd的来源问题,可以促进ofd更快的普及。

       作者研究ofd和pdf多年,采用c#实现了pdf转ofd,并将此功能集成到阅读器;阅读器打开pdf文件时,是将pdf转换为ofd后再显示的。完全实现pdf到ofd的转换需要大量的工作,作者会逐步完善。对于wps生成的pdf的文件,大部分是可以转换成功的。ofd阅读器下载(集成pdf与ofd互转)(百度网盘提取密码:jj9v)。

    pdf转ofd初步思路

      板式文件描述的内基本分为三大类:文字、线、图,称之为图元。绘制图元时,还需要确定图元所处的“环境”,如:前景色、背景色、剪切区域、坐标系等;称之为状态。最终的呈现效果由图元和状态决定的。

     

       ofd与pdf描述这些元素的词是完全不同的,但是有相同的“意境”。将pdf转换为ofd的前提是充分理解pdf和ofd标准,找准两个标准相通的“意境”;转换就是意境的转换,而不是词汇的转换。下面逐步分析两个标准之间的差异。

    pdf与ofd文档描述差异

      pdf属于单体文件,ofd属于容器文件;暨ofd是压缩包,压缩包包含多个文件。pdf文件分为很多块,每个块称之为object,有唯一id对应。每个块分为header和body,header描述格式为dictionary。pdf文件的结构需要通过专用软件才能查看,这一点不如ofd。pdf文件内容查看器。

     

       ofd容器内主要包括资源文件和格式描述文件。资源文件可以是任意文件,如:图片、字体、签章数据等;文件之间互不影响,可以方便的添加删除文件。格式文件是描述呈现格式的文件,为xml格式;采用xml格式的好处是:xml是标准格式、解析xml有现成的库;xml的描述能力也比pdf的文本描述能力更好。

      对于状态的描述,ofd和pdf采用了两种不同的方式。pdf对状态的描述是分散的,确定当前状态的属性需要追溯到文档开始。ofd对状态的描述是自包含的,仅仅通过当前xml节点就能确定状态属性。从上可以看出,分析pdf的状态难度更大,但是pdf这种描述方式更能节省空间,特别是描述非常复杂的状态时。

     文字描述差异

      pdf对文字的描述比ofd要复杂很多;pdf标准诞生时,还没有unicode概念,最初pdf只是用来显示拉丁文字。为了显示东亚文件,pdf标准只能另辟蹊径,采用了cid格式字体文件。ofd对字体描述统一采用unicode,达到了化繁为简的效果。

    图片描述差异

      pdf图片处理部分比ofd复杂很多。pdf中的图片不是一个直接的“图”,它会描述图的压缩格式、像素颜色个数、调色板等信息,需要软件合成图片文件;而ofd文件是直接存入一个图片文件。

    线描述差异

      这两部分差异不大,线处理是相对来说简单些。ofd有一个特殊的操作符A,用来表示圆弧。

    c# 实现pdf转ofd步骤

    1)pdf文件读取

      可以借助开源库处理pdf,比如:itext,apose,pdfbox等。pdf文件的结构还是比较复杂的,实现文件的读取逻辑也是非常复杂。

    2)pdf指令的分割

    每个pdf的指令包括操作数和操作符。这些数据是混合到一块的,需要快速高效的找到每个完整的指令。

    下图恰好是每行一个指令。

     

     3)pdf指令的处理

      这里是pdf处理最复杂部分。pdf指令归为十几大类。从作用上来讲可以分为两类:状态指令、操作指令。状态指令是修改pdf状态属性的,操作指令是执行具体操作,如:显示文字、划线等。

    4) pdf转ofd

      理解pdf的处理指令就是掌握了“语义”,这是将pdf翻译成ofd必要条件。将语义用xml语法表示出来就是水到渠成的事。

     

    后记 要完成pdf转ofd的功能,需要同时理解pdf和ofd标准。只要准确把握了这两种标准的内涵,就能实现pdf转ofd而又能确保不失真。

      在板式文件领域,pdf仍然是主流;但是ofd具有后发优势。pdf标准文档达1300多页,还有大量的附加协议,完全掌握pdf标准需要假以时日。pdf标准出现的较早,所以背负了沉重的历史包袱;标准中的部分内容在今天看来是过时、冗余的。

      pdf已成为事实上的国际标准,流式文档软件(wps等)或其他编辑设计软件大都有转换pdf功能。ofd的普及需要各方面的共同努力, 让用户快捷方便的生成ofd文件是其中重要的一环。毕竟,无源之水无法汇集成浩瀚海洋。作者用c#尝试实现了pdf转ofd功能,达到了初步可用状况。实现pdf完美转换为ofd及ofd在国内普及是作者的梦想;前途漫漫,唯有奋斗。

      

     

    专注.NET、VC++。擅长WPF、WinForm、Socket等技术。 技术交流 QQ群(618168615)
  • 相关阅读:
    kotlin中值范围
    kotlin中集合
    kotlin数据解构
    Java 8 Lambda 表达式
    kotlin 之内联函数
    kotlin之函数的范围和泛型函数
    kotlin函数的参数和返回值
    kotlin 之单表达式函数
    kotlin使用中辍标记法调用函数
    kotlin之函数的基本用法
  • 原文地址:https://www.cnblogs.com/yuanchenhui/p/pdf2ofd.html
Copyright © 2011-2022 走看看