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)
  • 相关阅读:
    LeetCode——Generate Parentheses
    LeetCode——Best Time to Buy and Sell Stock IV
    LeetCode——Best Time to Buy and Sell Stock III
    LeetCode——Best Time to Buy and Sell Stock
    LeetCode——Find Minimum in Rotated Sorted Array
    Mahout实现基于用户的协同过滤算法
    使用Java对文件进行解压缩
    LeetCode——Convert Sorted Array to Binary Search Tree
    LeetCode——Missing Number
    LeetCode——Integer to Roman
  • 原文地址:https://www.cnblogs.com/yuanchenhui/p/pdf2ofd.html
Copyright © 2011-2022 走看看