思路初探:采用c#实现pdf转ofd
前言? 版式文檔格式是版面呈現(xiàn)效果固定的電子文檔格式, pdf和ofd均為板式文檔格式標(biāo)準(zhǔn);pdf板式文件占有絕對(duì)的統(tǒng)治地位;ofd是我國(guó)自主研發(fā)的板式文檔規(guī)范,屬于后起之秀。同為板式文件, 理論上可以實(shí)現(xiàn)互轉(zhuǎn)而又能達(dá)到呈現(xiàn)格式完全一致。
ofd標(biāo)準(zhǔn)晚于pdf標(biāo)準(zhǔn)將近20年,ofd標(biāo)準(zhǔn)采用吸納了軟件行業(yè)近年來(lái)的一些先進(jìn)技術(shù)和通用做法;ofd和pdf雖均為板式文件,但是兩個(gè)標(biāo)準(zhǔn)對(duì)板式文件的描述差別還是非常大的。市面上的板式文件大部分為pdf,如果能實(shí)現(xiàn)pdf轉(zhuǎn)ofd,就解決了ofd的來(lái)源問(wèn)題,可以促進(jìn)ofd更快的普及。
? ?作者研究ofd和pdf多年,采用c#實(shí)現(xiàn)了pdf轉(zhuǎn)ofd,并將此功能集成到閱讀器;閱讀器打開(kāi)pdf文件時(shí),是將pdf轉(zhuǎn)換為ofd后再顯示的。完全實(shí)現(xiàn)pdf到ofd的轉(zhuǎn)換需要大量的工作,作者會(huì)逐步完善。對(duì)于wps生成的pdf的文件,大部分是可以轉(zhuǎn)換成功的。ofd閱讀器下載(集成pdf與ofd互轉(zhuǎn))(百度網(wǎng)盤(pán)提取密碼:jj9v)。
pdf轉(zhuǎn)ofd初步思路
板式文件描述的內(nèi)基本分為三大類(lèi):文字、線、圖,稱(chēng)之為圖元。繪制圖元時(shí),還需要確定圖元所處的“環(huán)境”,如:前景色、背景色、剪切區(qū)域、坐標(biāo)系等;稱(chēng)之為狀態(tài)。最終的呈現(xiàn)效果由圖元和狀態(tài)決定的。
?
? ofd與pdf描述這些元素的詞是完全不同的,但是有相同的“意境”。將pdf轉(zhuǎn)換為ofd的前提是充分理解pdf和ofd標(biāo)準(zhǔn),找準(zhǔn)兩個(gè)標(biāo)準(zhǔn)相通的“意境”;轉(zhuǎn)換就是意境的轉(zhuǎn)換,而不是詞匯的轉(zhuǎn)換。下面逐步分析兩個(gè)標(biāo)準(zhǔn)之間的差異。
pdf與ofd文檔描述差異
pdf屬于單體文件,ofd屬于容器文件;暨ofd是壓縮包,壓縮包包含多個(gè)文件。pdf文件分為很多塊,每個(gè)塊稱(chēng)之為object,有唯一id對(duì)應(yīng)。每個(gè)塊分為header和body,header描述格式為dictionary。pdf文件的結(jié)構(gòu)需要通過(guò)專(zhuān)用軟件才能查看,這一點(diǎn)不如ofd。pdf文件內(nèi)容查看器。
?
? ofd容器內(nèi)主要包括資源文件和格式描述文件。資源文件可以是任意文件,如:圖片、字體、簽章數(shù)據(jù)等;文件之間互不影響,可以方便的添加刪除文件。格式文件是描述呈現(xiàn)格式的文件,為xml格式;采用xml格式的好處是:xml是標(biāo)準(zhǔn)格式、解析xml有現(xiàn)成的庫(kù);xml的描述能力也比pdf的文本描述能力更好。
對(duì)于狀態(tài)的描述,ofd和pdf采用了兩種不同的方式。pdf對(duì)狀態(tài)的描述是分散的,確定當(dāng)前狀態(tài)的屬性需要追溯到文檔開(kāi)始。ofd對(duì)狀態(tài)的描述是自包含的,僅僅通過(guò)當(dāng)前xml節(jié)點(diǎn)就能確定狀態(tài)屬性。從上可以看出,分析pdf的狀態(tài)難度更大,但是pdf這種描述方式更能節(jié)省空間,特別是描述非常復(fù)雜的狀態(tài)時(shí)。
?文字描述差異
pdf對(duì)文字的描述比ofd要復(fù)雜很多;pdf標(biāo)準(zhǔn)誕生時(shí),還沒(méi)有unicode概念,最初pdf只是用來(lái)顯示拉丁文字。為了顯示東亞文件,pdf標(biāo)準(zhǔn)只能另辟蹊徑,采用了cid格式字體文件。ofd對(duì)字體描述統(tǒng)一采用unicode,達(dá)到了化繁為簡(jiǎn)的效果。
圖片描述差異
pdf圖片處理部分比ofd復(fù)雜很多。pdf中的圖片不是一個(gè)直接的“圖”,它會(huì)描述圖的壓縮格式、像素顏色個(gè)數(shù)、調(diào)色板等信息,需要軟件合成圖片文件;而ofd文件是直接存入一個(gè)圖片文件。
線描述差異
這兩部分差異不大,線處理是相對(duì)來(lái)說(shuō)簡(jiǎn)單些。ofd有一個(gè)特殊的操作符A,用來(lái)表示圓弧。
c# 實(shí)現(xiàn)pdf轉(zhuǎn)ofd步驟
1)pdf文件讀取
可以借助開(kāi)源庫(kù)處理pdf,比如:itext,apose,pdfbox等。pdf文件的結(jié)構(gòu)還是比較復(fù)雜的,實(shí)現(xiàn)文件的讀取邏輯也是非常復(fù)雜。
2)pdf指令的分割
每個(gè)pdf的指令包括操作數(shù)和操作符。這些數(shù)據(jù)是混合到一塊的,需要快速高效的找到每個(gè)完整的指令。
下圖恰好是每行一個(gè)指令。
?
?3)pdf指令的處理
這里是pdf處理最復(fù)雜部分。pdf指令歸為十幾大類(lèi)。從作用上來(lái)講可以分為兩類(lèi):狀態(tài)指令、操作指令。狀態(tài)指令是修改pdf狀態(tài)屬性的,操作指令是執(zhí)行具體操作,如:顯示文字、劃線等。
4) pdf轉(zhuǎn)ofd
理解pdf的處理指令就是掌握了“語(yǔ)義”,這是將pdf翻譯成ofd必要條件。將語(yǔ)義用xml語(yǔ)法表示出來(lái)就是水到渠成的事。
后記 要完成pdf轉(zhuǎn)ofd的功能,需要同時(shí)理解pdf和ofd標(biāo)準(zhǔn)。只要準(zhǔn)確把握了這兩種標(biāo)準(zhǔn)的內(nèi)涵,就能實(shí)現(xiàn)pdf轉(zhuǎn)ofd而又能確保不失真。
在板式文件領(lǐng)域,pdf仍然是主流;但是ofd具有后發(fā)優(yōu)勢(shì)。pdf標(biāo)準(zhǔn)文檔達(dá)1300多頁(yè),還有大量的附加協(xié)議,完全掌握pdf標(biāo)準(zhǔn)需要假以時(shí)日。pdf標(biāo)準(zhǔn)出現(xiàn)的較早,所以背負(fù)了沉重的歷史包袱;標(biāo)準(zhǔn)中的部分內(nèi)容在今天看來(lái)是過(guò)時(shí)、冗余的。
pdf已成為事實(shí)上的國(guó)際標(biāo)準(zhǔn),流式文檔軟件(wps等)或其他編輯設(shè)計(jì)軟件大都有轉(zhuǎn)換pdf功能。ofd的普及需要各方面的共同努力, 讓用戶快捷方便的生成ofd文件是其中重要的一環(huán)。畢竟,無(wú)源之水無(wú)法匯集成浩瀚海洋。作者用c#嘗試實(shí)現(xiàn)了pdf轉(zhuǎn)ofd功能,達(dá)到了初步可用狀況。實(shí)現(xiàn)pdf完美轉(zhuǎn)換為ofd及ofd在國(guó)內(nèi)普及是作者的夢(mèng)想;前途漫漫,唯有奮斗。
總結(jié)
以上是生活随笔為你收集整理的思路初探:采用c#实现pdf转ofd的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: pojo java_Java——POJO
- 下一篇: c# char unsigned_dll