思路初探:采用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在國內普及是作者的夢想;前途漫漫,唯有奮斗。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM