專利名稱:文檔處理系統(tǒng)和文檔處理方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種對文檔進(jìn)行處理的系統(tǒng)和方法,特別涉及一種文檔處理系統(tǒng)和文檔處理方法,該系統(tǒng)和方法能處理多個文檔構(gòu)成的文檔庫,并能使不同應(yīng)用軟件對同一文檔進(jìn)行互操作。
背景技術(shù):
目前關(guān)于各種非結(jié)構(gòu)化文檔的軟件已經(jīng)比較普及,形成了多種文檔格式林立的狀況。例如,一個內(nèi)容管理軟件往往要處理二三百種文檔格式,而且這些格式還在不斷更新,給軟件開發(fā)商帶來了巨大的困難。如何解決文檔通用性、進(jìn)行數(shù)字內(nèi)容提取、格式兼容越來越成為人們的關(guān)注點,人們迫切希望解決以下問題1)文檔不通用基本上只能用同一種軟件在不同的人之間交換文檔,但不能在不同的軟件之間互相交換文檔,形成信息封閉。
2)文檔信息提取困難文檔描述信息豐富,數(shù)據(jù)結(jié)構(gòu)復(fù)雜,實現(xiàn)難度較大。每一家公司都把自己的書面文檔描述作為獨家特有技術(shù)、基本上不提供開放接口。
3)訪問接口不統(tǒng)一、數(shù)據(jù)兼容困難或代價太高不同的文檔處理軟件之間,文件格式互不兼容,在處理過程中要么利用對方組件解析(前提是對方提供相應(yīng)接口),要么自己投入研發(fā)力量從頭到尾的解析對方的格式。
4)信息安全較差目前針對書面文檔的權(quán)限控制手段單一,主要是數(shù)據(jù)加密、口令認(rèn)證。因為信息泄露,每年造成巨大損失的公司案例層出不窮。
5)都是針對單個文檔的處理,缺乏多文檔管理手段每個人電腦中都有大量文檔,但多個文檔之間缺乏有效的組織管理,而且資源共享很難。如,字庫/字體文件、全文數(shù)據(jù)檢索等。
6)行業(yè)競爭層次還停留在各自格式描述之爭上由于書面文檔數(shù)據(jù)結(jié)構(gòu)復(fù)雜、數(shù)據(jù)描述豐富、文檔數(shù)據(jù)長度不確定,每一個文檔都千差萬別。長期以來,大家都在關(guān)注文檔格式標(biāo)準(zhǔn),各大公司都努力將自己特有的文檔格式發(fā)展為市場標(biāo)準(zhǔn),各標(biāo)準(zhǔn)組織也致力于制訂通用的文檔格式標(biāo)準(zhǔn)。但不管是專有的文檔格式(如.doc)還是開放的文檔格式(如PDF),只要是以文檔格式為標(biāo)準(zhǔn),就不可避免產(chǎn)生以下問題a)重復(fù)開發(fā),效果不統(tǒng)一使用同一標(biāo)準(zhǔn)的不同軟件都需要自己去解釋、生成該格式的文檔,造成大量重復(fù)開發(fā),而且會因為各家解釋程序不同,有的完善有的相對簡單,有的支持新版本有的只支持舊版本數(shù)據(jù),同一文檔在不同軟件下顯現(xiàn)出不同的版式,甚至出現(xiàn)解釋錯誤無法打開。
b)阻礙創(chuàng)新軟件是不斷創(chuàng)新的行業(yè),但由于每增加一個新功能就需要增加描述該功能的信息,但只有等到標(biāo)準(zhǔn)修訂的時候才能增加新的格式,因此把存儲格式固定死之后,將會妨礙技術(shù)創(chuàng)新的競爭。
c)影響性能對海量信息,需要增加大量的檢索信息以提高檢索性能,但固定死的存儲格式難以增加檢索信息。
d)影響可移植性和可伸縮性在不同的系統(tǒng)環(huán)境下,不同的應(yīng)用需求,可能會有不同的存儲要求。例如,存儲在硬盤上就需要考慮如何減少磁頭尋道的次數(shù)以提高性能,而在嵌入式應(yīng)用中數(shù)據(jù)都相當(dāng)于存儲在內(nèi)存中的,就不存在這個問題。事實上,數(shù)據(jù)庫軟件也往往都是這樣設(shè)計的,同一個廠商的數(shù)據(jù)庫軟件在不同平臺上就可能會使用不同的存儲格式。因此,設(shè)置文檔存儲標(biāo)準(zhǔn)將會影響系統(tǒng)的可移植性和可伸縮性。
7)頁面分層的技術(shù)不完善目前一些軟件,如Adobe的photoshop,Microsoft的word,多多少少已經(jīng)有層的概念,但層的功能還比較單一,管理手段比較簡單,不能滿足應(yīng)用需求。
8)檢索手段還不夠豐富隨著信息的海量化,用任何一個關(guān)鍵詞來搜索都會得到數(shù)量龐大的檢索結(jié)果,全文檢索技術(shù)基本解決了查全率的問題,但查準(zhǔn)率迅速上升為首要問題?,F(xiàn)有技術(shù)還沒有很充分地利用全部信息來解決查準(zhǔn)率問題,例如每個文字的字體、字號完全可以用來判斷該文字的重要性,但都在檢索時被忽略了。
事實上,一種文檔格式不管是否開放,最后結(jié)果往往都是被特定軟件所壟斷。商業(yè)實踐的結(jié)果證明,不管是.doc這種已經(jīng)被無數(shù)的同行研究得比較透、大家都花了巨大的精力和人力物力去兼容的文檔格式,還是PDF這種完全公開的文檔格式,在實際應(yīng)用中用戶還是會選擇用原廠商的軟件(即MSWord和Adobe Acrobat)來處理,而不太愿意用第三方的軟件。一種文檔格式被特定軟件所壟斷會造成信息流不暢通,非常不利于進(jìn)行信息化建設(shè),而且還會造成用戶過分集中到大軟件公司的軟件上,形成對用戶不利的壟斷。例如,MS Office的表格功能不夠好,但即使有人開發(fā)了非常好用的表格編輯軟件,也很難在市場上生存,因為基本上沒有哪個文檔通篇只有表格,這樣用戶還只能使用那些功能比較全的軟件,盡管其中的表格功能并不好用,因此市場就被MS Office這種全能軟件所壟斷,大量中小軟件公司開發(fā)的“專而不全”的軟件缺乏市場空間。
現(xiàn)有技術(shù)中最開放、可交換性最好的是Adobe Acrobat采用的PDF。PDF已經(jīng)成為全球分檔分發(fā)、交換的事實標(biāo)準(zhǔn),但也只能在不同的人之間交換文檔,不能在不同的軟件之間交換文檔,即不能實現(xiàn)文檔的互操作性。而且不管是Acrobat,還是Office,都只能對單文檔進(jìn)行處理,缺乏對多文檔的管理功能,不具備對文檔庫進(jìn)行操作的功能。
在文檔信息安全方面,現(xiàn)有技術(shù)也存在較多缺陷。Word和PDF這些應(yīng)用最廣泛的文檔,都是采用對數(shù)據(jù)加密或者口令認(rèn)證等進(jìn)行數(shù)據(jù)安全控制,沒有提供系統(tǒng)的身份認(rèn)證機(jī)制,對權(quán)限的控制都是整個文檔范圍的,不能細(xì)化到文檔內(nèi)的任意區(qū)域,對邏輯數(shù)據(jù)指定加密和簽名是受限的,無法對任意邏輯數(shù)據(jù)設(shè)定加密和簽名。內(nèi)容管理系統(tǒng)雖然能夠提供很好的身份認(rèn)證機(jī)制,但由于與文檔處理系統(tǒng)是分離的,不能在核心層集成,不僅管理粒度只能做到文檔級,而且在文檔使用過程中就脫離了內(nèi)容管理系統(tǒng)的安全控制,難以進(jìn)行必要的安全管理。通常情況下,安全機(jī)制與文檔處理是分離的模塊,容易出現(xiàn)安全縫隙。
下面介紹本發(fā)明中會涉及到的一些現(xiàn)有技術(shù)和概念非對稱密鑰加密算法也叫公開密鑰體系(Public Key Infrastructure,PKI)算法,由美國斯坦福大學(xué)赫爾曼教授于1977年提出。它主要指加密密鑰和解密密鑰不相同,而且相互之間不存在推導(dǎo)關(guān)系,用戶公開其中一個密鑰不會泄漏另一把密鑰。這樣其他人可以用公鑰對發(fā)送的信息進(jìn)行加密,安全地傳送到該用戶,然后由該用戶用自己的私鑰進(jìn)行解密。PKI技術(shù)解決了密鑰的發(fā)布和管理問題,是目前常用的密碼技術(shù)。使用PKI技術(shù),進(jìn)行數(shù)據(jù)通信的雙方可以安全地確認(rèn)對方身份和公開密鑰,提供通信的可鑒別性。目前,常用的PKI算法有橢圓曲線密碼加密算法(Elliptic Curves Cryptography,ECC),RSA加密算法(Ron Rivest,Adi Shamir,Len Adleman公私鑰算法)等。
RSA算法描述如下公鑰n=pq,(p,q為兩個不同的很大的質(zhì)數(shù),p和q必須保密);將(p-1)和(q-1)相乘得到φ(n);選擇一個整數(shù)e(1<e<φ(n))與φ(n)互質(zhì);私鑰d=e-1modφ(n),即計算一個數(shù)字d,使得它滿足公式de=1 modφ(n);加密c=mc(mod n);解密m=cd(mod n),m為明文,c為密文。
橢圓曲線密碼加密算法(ECC)是另一種非對稱密鑰加密算法,橢圓曲線用于密碼算法,于1985年由Koblitz和Victor Miller分別獨立地提出。它問世以來一直是密碼分析學(xué)的研究對象?,F(xiàn)在,在商業(yè)和政府的用途中,橢圓曲線密碼系統(tǒng)(ECC)都被認(rèn)為是安全的。根據(jù)已知的密碼分析學(xué)知識,橢圓曲線密碼系統(tǒng)相比于傳統(tǒng)的密碼系統(tǒng)來說提供了更高的安全性。
ECC加密算法描述如下大素數(shù)域上的橢圓曲線可通過同構(gòu)映射將一般的曲線方程變換為特別簡單的形式y(tǒng)2=x3+ax+b,其中曲線參數(shù)a,b∈Fp并且滿足4a3+27b2≠0(modp)。
因此,滿足下列方程的所有點(x,y),再加上無窮遠(yuǎn)點O∞,構(gòu)成一條定義在大素數(shù)域Fp上的橢圓曲線。
Y2=x3+ax+b(mod p)其中x,y屬于0到p-1間的大素數(shù),并將這條橢圓曲線記為Ep(a,b)。
考慮如下等式K=kG[其中K,G為Ep(a,b)上的點,k為小于n(n是點G的階)的整數(shù),不難發(fā)現(xiàn),給定k和G,根據(jù)加法法則,計算K很容易;但給定K和G,求k就相當(dāng)困難了。
這就是橢圓曲線密碼系統(tǒng)基于的數(shù)學(xué)難題。把點G稱為基點(basepoint),k(k<n,n為基點G的階)稱為私有密鑰(private key),K稱為公開密鑰(public key)。
加密算法還可以是公知的對稱算法,對稱算法就是指加密和解密過程均采用同一把密鑰。如AES算法。
AES算法是1997年1月由NIST提出的,其目的是開發(fā)一種新的能保證政府信息安全的編碼算法。最后經(jīng)過多方評估從15種算法中選出Rijndael算法作為AES編碼標(biāo)準(zhǔn)算法。AES算法是對稱加密的迭代分組密碼。它把數(shù)據(jù)塊分成比特陣列,每一項密碼操作都是面向比特的。Rijndael算法分為四層,第一層是8×8比特置換(即輸入8比特,輸出8比特);第二、三層是線性混合層(陣列的行移位、列混合);第四層是子密鑰與陣列的每比特異或。
AES的分組長度為128比特,密鑰長度為128/192/256比特,相對應(yīng)的輪數(shù)r為10/12/14,相應(yīng)的密鑰方案為在加密的過程中,需要r+1個子密鑰,需要構(gòu)造4(r+1)個32比特字。當(dāng)種子密鑰為128和192比特時,構(gòu)造4(r+1)個32比特字的過程是一樣的。但當(dāng)種子密鑰為256比特時,構(gòu)造4(r+1)個32比特字的過程是不同的。
HASH也稱為散列或消息摘要或數(shù)字摘要,就是通過把單向HASH函數(shù)應(yīng)用于信息,將任意長度的一塊數(shù)據(jù)轉(zhuǎn)換為一段定長的、不可逆轉(zhuǎn)的數(shù)據(jù),稱為該數(shù)據(jù)的HASH值。從理論上講,任何HASH算法,產(chǎn)生碰撞(即兩塊不同的數(shù)據(jù)具有相同的HASH值)是必然的。HASH算法的安全性有兩層含義一是由HASH值不能反推出原數(shù)據(jù);二是要構(gòu)造兩塊具有相同HASH值的不同的數(shù)據(jù)在計算上是不可行的,盡管理論上是存在的。目前MD5、SHA1和SHA256被認(rèn)為是比較安全的HASH算法。另一方面,HASH函數(shù)的計算一般都比較快,相對簡單。
并集是指多個集合的所有元素組成的集合。
設(shè)A、B為兩集合,若A中任意的元素x都屬于B,則稱B為A的超集,稱A為B的子集。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供創(chuàng)新的對文檔進(jìn)行處理的文檔處理系統(tǒng)和文檔處理方法,實現(xiàn)文檔的互操作、對多文檔的管理、更好的文檔安全性以及更好的查詢檢索。
依照本發(fā)明的對文檔庫進(jìn)行處理的文檔處理系統(tǒng),其包括文檔庫系統(tǒng)、存儲器、應(yīng)用軟件,其中,文檔庫的數(shù)據(jù)存儲在存儲器中,文檔庫系統(tǒng)和應(yīng)用軟件通過一種標(biāo)準(zhǔn)調(diào)用接口連接起來,該標(biāo)準(zhǔn)調(diào)用接口采用與平臺無關(guān)的描述方式進(jìn)行描述。應(yīng)用軟件對文檔的操作都統(tǒng)一成對一種預(yù)定義的通用文檔模型進(jìn)行的操作,并通過該標(biāo)準(zhǔn)調(diào)用接口向文檔庫系統(tǒng)發(fā)出指令,文檔庫系統(tǒng)按照應(yīng)用軟件的指令,對存儲在存儲器中的文檔庫執(zhí)行相應(yīng)的操作。
依照本發(fā)明的文檔處理方法,該方法包括以下步驟應(yīng)用軟件通過標(biāo)準(zhǔn)調(diào)用接口向文檔庫系統(tǒng)發(fā)出指令,其對文檔的操作都統(tǒng)一成對一種預(yù)定義的通用文檔模型進(jìn)行的操作;文檔庫系統(tǒng)按照應(yīng)用軟件的指令,對存儲在存儲器中的文檔庫執(zhí)行相應(yīng)的操作。其中,文檔庫系統(tǒng)和應(yīng)用軟件通過上述標(biāo)準(zhǔn)調(diào)用接口連接起來,該標(biāo)準(zhǔn)調(diào)用接口采用與平臺無關(guān)的描述方式進(jìn)行描述。
本發(fā)明改變了從用戶界面到文檔存儲都由一個軟件來完成的現(xiàn)狀,將其劃分為應(yīng)用軟件和文檔庫系統(tǒng)兩層,并定義了一個接口標(biāo)準(zhǔn)。文檔庫系統(tǒng)是具備各種文檔操作功能的通用技術(shù)平臺,并具有符合該標(biāo)準(zhǔn)的接口部,應(yīng)用軟件要對文檔進(jìn)行操作時就通過該接口部來向文檔庫系統(tǒng)發(fā)出相應(yīng)指令,文檔庫系統(tǒng)根據(jù)該指令執(zhí)行相應(yīng)操作。這樣,只要各應(yīng)用軟件和各文檔庫系統(tǒng)都遵循同樣的標(biāo)準(zhǔn),不同應(yīng)用軟件就可以通過同一個文檔庫系統(tǒng)對同一文檔操作,即可實現(xiàn)對文檔的互操作。同樣,同一個應(yīng)用軟件也可以通過不同文檔庫系統(tǒng)對不同文檔進(jìn)行操作,而不用分別對每種文檔格式都進(jìn)行單獨開發(fā)。
本發(fā)明還包括一個通用文檔模型,該模型能與各應(yīng)用軟件所需要處理的文檔相符合。接口標(biāo)準(zhǔn)就是基于該文檔模型來設(shè)計的,這樣才能實現(xiàn)不同的應(yīng)用軟件都可以通過同一個接口部來對文檔進(jìn)行操作。該通用文檔模型也適用于各種文檔格式,這樣同一個應(yīng)用軟件才可以通過同一個接口部來對不同文檔格式進(jìn)行操作。該通用文檔模型的具體內(nèi)容請參見后面的實施例。
本發(fā)明還包括一個通用文檔安全模型,該通用文檔安全模型符合各應(yīng)用軟件對文檔安全的需求,使不同的應(yīng)用軟件都可以通過同一個接口部實現(xiàn)對文檔的安全控制。該通用文檔安全模型的具體內(nèi)容請參見后面的實施例說明。
接口標(biāo)準(zhǔn)定義了基于該通用文檔模型和通用文檔安全模型對文檔進(jìn)行操作的各種指令,以及應(yīng)用軟件向文檔庫系統(tǒng)發(fā)送指令的方式。文檔庫系統(tǒng)具備實現(xiàn)這些指令的功能,以供應(yīng)用軟件調(diào)用。接口標(biāo)準(zhǔn)可以用命令串該通用文檔模型還包括由多個文檔組成的文檔集、文檔庫和文檔倉庫等層次,接口標(biāo)準(zhǔn)中也包含對多文檔的組織管理、查詢檢索、安全控制等指令。
該通用模型還包括將頁由具有上下順序的層組成,接口標(biāo)準(zhǔn)中也包含對層的各種操作指令,以及對一個文檔某一層所對應(yīng)源文件的存儲和提取。
文檔庫系統(tǒng)還具備對文檔的信息安全管理控制功能,如基于角色的細(xì)粒度權(quán)限管理,并在接口標(biāo)準(zhǔn)中定義了相關(guān)的操作指令。
依照本發(fā)明的系統(tǒng)由存儲器、文檔庫系統(tǒng)和應(yīng)用軟件組成。其中,文檔數(shù)據(jù)存儲在存儲器中,文檔庫系統(tǒng)有一個下接口部,應(yīng)用軟件有一個上接口部。當(dāng)應(yīng)用軟件需要對文檔庫進(jìn)行操作時,通過其上接口部向文檔庫系統(tǒng)的下接口部發(fā)出指令,文檔庫系統(tǒng)按照應(yīng)用軟件發(fā)出的指令,對存儲在存儲器中的文檔數(shù)據(jù)執(zhí)行相應(yīng)的操作。
依照本發(fā)明,使得應(yīng)用層和數(shù)據(jù)處理層分離。這樣應(yīng)用軟件不再直接跟具體的文檔格式打交道,文檔也不再與特定應(yīng)用軟件綁定,從而使得同一文檔能在不同的應(yīng)用軟件之間通用,同一應(yīng)用軟件也能對不同文檔進(jìn)行操作,實現(xiàn)了文檔的互操作;整個文檔處理系統(tǒng)還具備多文檔處理功能,而不局限在單文檔處理;將頁分成多層后,可以實現(xiàn)對不同層實施不同管理和控制,更便于不同應(yīng)用軟件對同一頁的操作(可以設(shè)計成不同應(yīng)用軟件管理和維護(hù)不同層),為以源文件方式進(jìn)行編輯提供了便利,也是一種很好的保留歷史痕跡的方式;通過將信息安全集成在文檔處理的核心層,可以消滅安全縫隙,還能使安全機(jī)制與文檔操作緊密地結(jié)合為一體,而不是可以分離的兩個模塊,同時有更多的空間部署安全管理技術(shù),相關(guān)代碼也能隱藏得更深,能更有效地防御非法攻擊,提高安全可靠度,另外還能提供細(xì)粒度的安全管理手段,如更多的權(quán)限類別,更小的管理單元。
圖1為依照本發(fā)明的文檔處理系統(tǒng)的結(jié)構(gòu)框圖。
圖2為依照本發(fā)明的通用文檔模型。
圖3-9為依照本發(fā)明的文檔模型的詳細(xì)邏輯結(jié)構(gòu)。
圖10-17給出了本發(fā)明中所定義的動作。
圖18為以UOML接口為例子的文檔處理系統(tǒng)。
具體實施例方式
下面,參照附圖,描述依照本發(fā)明的文檔操作系統(tǒng)。
如圖1所示,依照本發(fā)明的文檔處理系統(tǒng)主要由三個部分組成應(yīng)用軟件、文檔庫系統(tǒng)和存儲器。其中應(yīng)用軟件有一個上接口部,文檔庫系統(tǒng)有一個下接口部。
存儲器常用的是硬盤或者內(nèi)存,也可以是光盤、閃存、軟盤、磁帶,甚至還可以是遠(yuǎn)程的存儲設(shè)備,總之只要具備數(shù)據(jù)的存儲能力即可。在存儲器中存儲有多個文檔,但對應(yīng)用軟件而言并不需要關(guān)心文檔的具體存儲方式,只需要按照預(yù)定的文檔模型進(jìn)行操作。圖2所示為依照本發(fā)明的一種通用文檔模型。
各個軟件的功能千差萬別,對文檔的操作和記錄的數(shù)據(jù)也各自不同,例如Word和Excel處理的文檔就大相迥異。為了能夠定義出通用的文檔模型,我們可以參考紙張的特性,這是因為以紙張作為文檔信息的記錄手段是通行至今的標(biāo)準(zhǔn)方法,只要能具備紙張的所有功能,就能滿足工作、生活等實際應(yīng)用的需求。
根據(jù)這個思路,我們把文檔中的一頁當(dāng)成一張紙,凡是能畫到紙上的就記錄下來,即該文檔模型能夠描述頁面上的所有可見內(nèi)容?,F(xiàn)有技術(shù)中的頁面描述語言(如PostScript)可以描述所有能印在紙上的信息,因此這一部分就不再詳細(xì)闡述。一般說來,頁面上的可見內(nèi)容最終都可以歸為文字、圖形、圖像三類。
如果文檔中涉及到特定字體或特殊字符的話,為了保證在各臺電腦上都能有相同的效果,就需要在文檔中嵌入相應(yīng)字庫。為了提高存儲效率,字庫資源應(yīng)當(dāng)共享,這樣即使在多處使用了同一字符,也只需要嵌入一個字庫。圖像有時也是可能在多處出現(xiàn)的,例如每一頁共同的底圖,或經(jīng)常出現(xiàn)的公司標(biāo)識,這種情況下最好也能共享這些圖像。
當(dāng)然,作為更加先進(jìn)的信息處理工具,不能僅僅模擬紙張的特性,還可以增加一些增強(qiáng)的數(shù)字特性,例如元數(shù)據(jù)、導(dǎo)航、導(dǎo)讀、微縮版面。元數(shù)據(jù)是描述數(shù)據(jù)的數(shù)據(jù),例如作者、出版社、出版時間、ISBN號等就是圖書的元數(shù)據(jù)。元數(shù)據(jù)是業(yè)內(nèi)通用名詞,也不在此贅述。導(dǎo)航是類似圖書目錄的信息,也是業(yè)內(nèi)通用名詞。導(dǎo)讀信息描述了一篇文章所在的區(qū)域和閱讀順序,這樣當(dāng)閱讀者讀完一屏后就可以根據(jù)該信息自動判斷下一屏應(yīng)該顯示什么,這樣還能做到自動換欄、自動轉(zhuǎn)版,而不用閱讀者再手工指定位置。微縮版面是事先生成的各頁面的微縮圖,閱讀者可以通過查看微縮版面來指定閱讀哪一頁。
文檔模型包含文檔倉庫、文檔庫、文檔集、文檔、頁、層、對象組、版面對象等多個層次。
其中,文檔倉庫由一個或多個文檔庫組成,文檔庫之間的關(guān)系相對于文檔庫之下的層次之間的關(guān)系相對要松散一些,文檔庫之間可以非常簡單地組合和拆離,而不用對文檔庫本身的數(shù)據(jù)做改動,該多個文檔庫之間往往沒有建立統(tǒng)一索引(特別是全文索引),很多對文檔倉庫的檢索操作一般都需要遍歷各文檔庫的索引,而沒有統(tǒng)一的索引可用。每個文檔庫由一個或多個文檔集組成,每個文檔集由一個或多個文檔組成,還可以包含任意數(shù)量的子文檔集。這里所說的文檔相當(dāng)于目前普通的一個文檔文件(例如DOC文檔),文檔模型可以規(guī)定一個文檔只能屬于一個文檔集,但允許一個文檔屬于多個文檔集也是一種不錯的選擇。文檔庫不是多個文檔的簡單組合,它把多個文檔緊密地組織起來,特別是為文檔內(nèi)容統(tǒng)一建立了各種檢索索引后就能帶來更大的便利性。
每個文檔由一頁或存在一定順序(如前后順序)的多頁組成,每頁的版心可以不同,而且版心也不一定是矩形的,可以是任意形狀,可以用一條或多條封閉曲線表示版心。
每頁又由一層或按一定順序(如上下順序)的多層組成,各層之間如同玻璃板的疊加關(guān)系。層由任意數(shù)量的版面對象和對象組組成,版面對象是指狀態(tài)(如字體、字號、顏色、ROP等)、文字(包括符號)、圖形(如直線、曲線、填充了指定顏色的閉合區(qū)域、漸變色等)、圖象(如TIF、JPEG、BMP、JBIG等)、語義信息(如標(biāo)題開始、標(biāo)題結(jié)束、換行等)、源文件、腳本、插件、嵌入式對象、書簽、鏈接、流媒體、二進(jìn)制數(shù)據(jù)流等。一個或多個版面對象可以組成一個對象組。對象組也可以包含任意數(shù)量的子對象組。
文檔庫、文檔集、文檔、頁、層都可以還包括元數(shù)據(jù)(如名稱、最后修改時間等,其類型可以根據(jù)應(yīng)用需求來設(shè)置)和/或歷史痕跡;文檔中還可以包括導(dǎo)航信息、導(dǎo)讀信息、微縮版面;也可以把微縮版面放在頁或者層這個層次;文檔庫、文檔集、文檔、頁、層、對象組都可以還包括數(shù)字簽名;語義信息最好跟著版面信息走,這樣可以避免數(shù)據(jù)冗余,也比較容易與版面建立對應(yīng)關(guān)系;文檔庫、文檔還可以包括字庫、圖像等共享對象。
該文檔模型還可以定義一個或多個角色,為每個角色分配一定權(quán)限。權(quán)限以文檔庫、文檔集、文檔、頁、層、對象組、元數(shù)據(jù)為單元進(jìn)行分配,定義每個角色對該單元是否可讀、是否可寫、是否可復(fù)制、是否可打??;該文檔模型是一個超越以往單個文檔對應(yīng)單個文件的方式,文檔庫中包含多個文檔集、文檔集中包含多個文檔,而對于文檔庫中文檔內(nèi)容,采用了細(xì)粒度的訪問和安全控制,我們可以具體訪問文檔庫中某個文字或者矩形,而不像現(xiàn)在的文檔管理系統(tǒng)只能訪問到文件名。
圖3-9給出了一種符合本發(fā)明的文檔模型,文檔模型中所涉及的各對象以樹狀結(jié)構(gòu)組織,逐層展開、細(xì)化。
文檔倉庫對象是由一個或多個文檔庫對象組成。
如圖3所示,文檔庫對象是由一個或多個文檔集對象、任意數(shù)量文檔庫輔助對象和任意數(shù)量的文檔庫共享對象組成。
其中,如圖4所示,文檔庫輔助對象是指元數(shù)據(jù)對象、角色對象、權(quán)限對象、插件對象、索引信息對象、腳本對象、數(shù)字簽名對象、歷史痕跡對象等,文檔庫共享對象是指文檔庫中的不同文檔可能共同使用的對象,如字庫對象、圖像對象等。
其中,如圖5所示,每個文檔集對象由一個或多個文檔對象、任意數(shù)量的文檔集對象和任意數(shù)量的文檔集輔助對象組成。文檔集輔助對象是指元數(shù)據(jù)對象、數(shù)字簽名對象、歷史痕跡對象。當(dāng)文檔集對象包括多個文檔集對象時,其類似于文件夾包括多個文件夾的形式。
并且,如圖6所示,每個文檔對象由一個或多個頁面對象、任意數(shù)量的文檔輔助對象和任意數(shù)量的文檔共享對象組成。文檔輔助對象是指元數(shù)據(jù)對象、字庫對象、導(dǎo)航信息對象、導(dǎo)讀信息對象、微縮版面對象、數(shù)字簽名對象、歷史痕跡對象等,文檔共享對象是指文檔中的不同頁面可能共同使用的對象,如圖像對象、印章對象等。
在圖7所示的頁面對象中,每個頁面對象由一個或多個層對象和任意數(shù)量的頁面輔助對象組成。頁面輔助對象是指元數(shù)據(jù)對象、數(shù)字簽名對象、歷史痕跡對象。
每個層對象由一個或多個版面對象、任意數(shù)量的對象組和任意數(shù)量的層輔助對象組成(如圖8所示)。層輔助對象是指元數(shù)據(jù)對象、數(shù)字簽名對象、歷史痕跡對象。對象組由任意數(shù)量的版面對象、任意數(shù)量的對象組和可選的數(shù)字簽名對象組成。當(dāng)對象組包括多個對象組時,其類似于文件夾包括多個文件夾的形式。
進(jìn)一步,如圖9所示,版面對象是指狀態(tài)對象、文字對象、直線對象、曲線對象、圓弧對象、路徑對象、漸變色對象、圖像對象、流媒體對象、元數(shù)據(jù)對象、批注對象、語義信息對象、源文件對象、腳本對象、插件對象、二進(jìn)制數(shù)據(jù)流對象、書簽對象以及超鏈接對象。
其中,狀態(tài)對象又是由任意數(shù)量的字符集對象、字體對象、字號對象、文字顏色對象,光柵操作對象、背景色對象、線顏色對象、填充色對象、線型對象、線寬對象、線接頭對象、畫刷對象、陰影對象、陰影顏色對象、旋轉(zhuǎn)對象、空心字對象、勾邊字對象、透明對象、渲染模式對象組成。
在具體實施過程中,可以在上述文檔模型基礎(chǔ)上進(jìn)一步增強(qiáng)或簡化。如果在簡化模型中省略了文檔集對象,則文檔庫對象直接由文檔對象組成;如果在簡化模型中省略了層對象,則頁面對象直接由版面對象組成。最簡化的文檔模型是只有文檔對象、頁面對象、版面對象,其中版面對象只有文字對象、直線對象、圖像對象、字體對象、字號對象。完整模型和最簡化模型之間的各種中間模型都屬于本實施例的變形。
為了滿足各種應(yīng)用對文檔安全性的需求,我們還需要定義一種通用的文檔安全模型。由于現(xiàn)有軟件的文檔安全功能不夠強(qiáng),或者是安全管理機(jī)制與文檔處理模塊脫節(jié),因此不難定義一個涵蓋并超越現(xiàn)有應(yīng)用軟件的通用文檔安全模型1.在文檔庫中定義了若干角色,角色對象是文檔庫的子對象。如果對應(yīng)的文檔模型中沒有文檔庫對象,則角色是在文檔中定義的,即角色對象是文檔對象的子對象,此時本文檔安全模型中所說的文檔庫均用文檔替代。
2.可以指定任意角色對任意對象(文檔庫、文檔集、文檔、頁、層、對象組、版面對象等)的訪問權(quán)限。如果指定了對某個對象的訪問權(quán)限,則該權(quán)限將適用于其所有子對象。
3.文檔庫系統(tǒng)實現(xiàn)的訪問權(quán)限包括是否可讀、是否可寫、是否可再授權(quán)(使其他角色擁有自己的部分或全部權(quán)限)、是否可收回授權(quán)(去掉其他角色的部分或全部授權(quán))及上述權(quán)限的排列組合??梢远x更多權(quán)限(如不可打印),但需要由應(yīng)用軟件來配合實現(xiàn)。
4.可以用某個角色的身份對各對象進(jìn)行簽名。簽名范圍將包括該對象的子對象,以及引用到的對象。
5.文檔庫的初始創(chuàng)建者具有對該文檔庫的所有權(quán)限。
6.任何應(yīng)用軟件都可以創(chuàng)建新角色。新角色的初始權(quán)限是對任何對象都沒有任何權(quán)限??梢杂镁哂性偈跈?quán)權(quán)限的角色對新角色授予一定的權(quán)限。
7.創(chuàng)建角色對象的指令返回一個密鑰,作為今后登錄該角色的依據(jù),需要應(yīng)用軟件妥善保管。該密鑰通常是PKI的私鑰。
8.當(dāng)應(yīng)用軟件以某一角色身份登錄時,通常采用“挑戰(zhàn)-應(yīng)答”機(jī)制,即文檔庫系統(tǒng)用保存的角色公鑰加密一塊數(shù)據(jù)發(fā)給應(yīng)用軟件,應(yīng)用軟件解密后返回給文檔庫系統(tǒng),如果正確表明應(yīng)用軟件確實擁有該角色對應(yīng)的私鑰(為保險起見該認(rèn)證過程可能會重復(fù)幾次)。采用“挑戰(zhàn)-應(yīng)答”機(jī)制可以更好地保護(hù)私鑰的安全性9.可以創(chuàng)建一個特殊的缺省角色。當(dāng)存在缺省角色時,任何應(yīng)用軟件一打開文檔庫就視為自動以缺省角色身份登錄。
10.可以同時以多個角色身份登錄,此時擁有的權(quán)限是各角色權(quán)限的并集。
在具體實施過程中,可以在上述安全模型基礎(chǔ)上進(jìn)一步增強(qiáng)、簡化或合并步驟,都屬于本實施例的變形。
根據(jù)上述文檔模型、文檔安全模型和常用的文檔操作,可以定義相應(yīng)接口標(biāo)準(zhǔn),用于發(fā)送對文檔模型中各對象進(jìn)行操作的指令。特別地,如果在接口標(biāo)準(zhǔn)中定義了獲取版面位圖的指令,將對保障版面一致性和文檔互操作性起到非常關(guān)鍵的作用。
通過獲取版面位圖的指令,應(yīng)用軟件可以直接獲取指定頁面的指定位圖格式的版面位圖(用位圖方式表示的該頁面的顯示效果),而不用自行解釋處理每一個版面對象。也就是說,應(yīng)用軟件可以直接獲得準(zhǔn)確的版面位圖用于顯示/打印文檔,而不再需要自己挨個讀取頁面上每一層的每一個版面對象、自行解釋該對象的含義并在版面上體現(xiàn)出來。如果采用后一種方式的話,就又難免出現(xiàn)有的軟件解釋的比較全、比較準(zhǔn)確,有的軟件解釋的不全或不準(zhǔn)確,導(dǎo)致同一個文檔在不同軟件出現(xiàn)不同的顯示/打印效果,影響了文檔互操作的用戶體驗。通過由文檔庫系統(tǒng)統(tǒng)一生成版面位圖的方式,將保持版面一致性的關(guān)鍵點從應(yīng)用軟件移到了文檔庫系統(tǒng),從而為不同的應(yīng)用軟件打開同一文檔都能出現(xiàn)同樣的版面效果提供了可行之路。這一方面是因為文檔庫系統(tǒng)是統(tǒng)一的基礎(chǔ)技術(shù)平臺,由少數(shù)幾家專業(yè)的技術(shù)廠商開發(fā),肯定比各應(yīng)用軟件廠商實現(xiàn)得完整、準(zhǔn)確,要求各文檔庫系統(tǒng)都能完整準(zhǔn)確地解釋處理各版面對象是可行的,而同樣的要求對應(yīng)用軟件來說就不太可行了;另一方面是因為不同應(yīng)用軟件都可以與同一個文檔庫系統(tǒng)配套使用,這樣就更能確保顯示/打印效果的一致性了。簡單來說,就是要求應(yīng)用軟件之間保持一致不太可行,而要求文檔庫系統(tǒng)之間保持一致則是可行的,要求同一個文檔庫系統(tǒng)保持一致就更沒問題了。因此,為了保持同一文檔在不同應(yīng)用軟件之間的版面一致性,就需要把相關(guān)責(zé)任從應(yīng)用軟件轉(zhuǎn)移到文檔庫系統(tǒng),而由文檔庫系統(tǒng)來統(tǒng)一生成版面位圖是其中一個簡單易行的辦法。
更進(jìn)一步,獲取版面位圖的指令還可以指定頁面上的一個區(qū)域,可用于只顯示頁面的一個區(qū)域(例如當(dāng)頁面比屏幕大時就不需要顯示整頁,滾動頁面時也只需要重畫滾動的區(qū)域);當(dāng)該指令還允許指定獲取特定層組成的版面位圖,特別是可以指定由特定層以及該層下的所有層組成的版面位圖時,就可以很好地用于展現(xiàn)歷史痕跡,即可以看看在添加最近這一層以前是什么樣,再往前又是什么樣。如果需要的話,還可以具體指定哪一層參與位圖的生成,哪一層不參與。
在檢索查詢指令中,除了常規(guī)的關(guān)鍵詞檢索外,還可以提供更加豐富的檢索手段。在常規(guī)的搜索技術(shù)中,搜索是和文檔處理分離的,搜索程序只能從文檔中提取純文本信息,而無法獲取更多信息,只能基于文本信息檢索。但在本發(fā)明中,檢索查詢功能是集成在文檔處理的核心層(即文檔庫系統(tǒng))的,這樣就可以更充分地利用文檔中蘊(yùn)含的信息來提供更為強(qiáng)大的檢索手段,如1.基于字體信息的檢索,如檢索黑體字的“書生”,Times New Roman字體的“Sursen”。
2.基于字號信息的檢索,如檢索三號字的“書生”,20磅以上的“Sursen”,長字(即字高超過字寬)的“文檔庫”。
3.基于顏色的檢索,如檢索紅色的“書生”,藍(lán)色的“Sursen”。
4.基于版面位置的檢索,如檢索位于頁面上半部分的“書生”,位于頁腳的“Sursen”。
5.基于特殊修飾效果的檢索,如檢索斜體字的“書生”,順時針旋轉(zhuǎn)30度至90度之間的“Sursen”,空心字的“SEP”,勾邊字的“文檔庫”。
6.根據(jù)類似的思路,還可以進(jìn)一步提供其它類型的檢索,如檢索反白(黑底白字)的“書生”,壓圖的“Sursen”等。
7.可以檢索多個版面對象的組合,如“書生”距離“Sursen”不超過5厘米。
8.上述檢索條件的任意組合。
現(xiàn)在介紹接口標(biāo)準(zhǔn)的實現(xiàn)方式。接口標(biāo)準(zhǔn)可以是上接口部按照預(yù)先定義的標(biāo)準(zhǔn)格式生成命令串(如“<UOML_INSERT(OBJ=PAGE,PARENT=123.456.789,POS=3)/>”),將該命令串發(fā)送給下接口部,并從下接口部接收執(zhí)行結(jié)果或其它反饋信息;或者是下接口部提供一些具有標(biāo)準(zhǔn)名稱和參數(shù)的接口函數(shù)(如“BOOL UOI_InsertPage(UOI_Doc*pDoc,int nPage)”),上接口部直接調(diào)用這些標(biāo)準(zhǔn)函數(shù);或者是上述方法的組合。
接口標(biāo)準(zhǔn)還可以用“動作+對象”的方式來定義,這樣便于學(xué)習(xí)和理解,也便于保持接口標(biāo)準(zhǔn)的穩(wěn)定性。例如,對20種不同對象進(jìn)行10種操作,可以定義20×10=200種指令,也可以定義20種對象和10種動作,但顯然后一種方式大大減輕了記憶的負(fù)擔(dān),而且今后在對接口標(biāo)準(zhǔn)進(jìn)行擴(kuò)充時,增加一個對象或動作也很簡單。
例如,我們定義以下7種動作打開用于創(chuàng)建或打開文檔庫;關(guān)閉用于關(guān)閉會話句柄、關(guān)閉文檔庫;獲取用于獲取對象列表、對象相關(guān)屬性和數(shù)據(jù);設(shè)置用于設(shè)置/修改對象數(shù)據(jù);插入插入指定對象或數(shù)據(jù);刪除用于刪除對象的某個子對象;檢索查詢用于根據(jù)定義條件在文檔中找到符合條件的內(nèi)容,這些條件既可以是準(zhǔn)確的信息,也可以是不準(zhǔn)確的信息(模糊查找)。
我們再定義如下對象文檔庫、文檔集、文檔、頁、層、對象組、文字、圖像、圖形、路徑(由一組順序圖形連接組成,可以是閉合也可以不閉合的)、源文件、腳本、插件、音頻、視頻、角色等。
對象還包括下列狀態(tài)對象背景色、線的顏色、填充色、線型、線寬、ROP、畫刷、陰影、陰影顏色、字符高、字符寬、旋轉(zhuǎn)、透明、渲染模式等。
在采用“動作+對象”方式時,不能自動理解為每一個對象和每一個動作的所有組合都一定能構(gòu)成有實際意義的操作指令,在很多實施例中會存在一些組合是沒有意義的,就象不是所有動詞和所有名詞都能組成以意義的詞組一樣。
以下是用“動作+對象”的格式定義命令的一種實施例,該實施例被稱為UOML,是用XML描述的一系列的命令。上接口部生成符合UOML格式的字符串,并將該字符串發(fā)送給下接口部,就將相應(yīng)的操作指令發(fā)送給了文檔庫系統(tǒng)。文檔庫系統(tǒng)執(zhí)行這些命令后,下接口部將執(zhí)行結(jié)果也生成一個符合UOML格式的字符串,返回給上接口部,使應(yīng)用軟件能夠知曉操作執(zhí)行結(jié)果。
所有執(zhí)行結(jié)果都由UOML_RET表示,其定義如下(參閱圖10)屬性SUCCESS為true時表明操作成功,為false表明操作失敗。
子元素ERR_INFO可選,僅當(dāng)操作失敗時出現(xiàn),描述了相應(yīng)的錯誤信息。
其它子元素根據(jù)具體動作確定,可參考以下各動作說明。
UOML動作包括1.UOML_OPEN創(chuàng)建或打開文檔庫(參閱圖11)1.1屬性1.1.1create為true時是創(chuàng)建,否則是打開已有文檔庫1.2子元素1.2.1path文檔庫路徑??梢允谴疟P文件名,也可以是URL,或者是內(nèi)存指針,或者是網(wǎng)絡(luò)路徑,或者是文檔庫的邏輯名稱,或者其它能夠指定文檔庫的表示方法。可以用不同特征的字符串區(qū)分上述各種情況,即不用改變命令格式,只要給字符串設(shè)置不同特征,就可以用不同的方法指定文檔庫。例如,磁盤文件名采用設(shè)備名稱(如盤符)和“:”開頭(如“C:”、“D:”),而且緊跟著“:”不會是“//”,也不會是又一個“:”;URL采用協(xié)議名稱和“://”開頭(如“http://”);內(nèi)存指針用“MEM::”開頭,后面是指針的字符串表示方式,例如“MEM::12345678”;網(wǎng)絡(luò)路徑是“\\”開頭,后面是服務(wù)器名,以及服務(wù)器上的路徑,如“\\server\abc\def.sep”;文檔庫的邏輯名稱可以用“*”開頭,如“*MyDocBasel”。在下接口解析時,如果第一個字母是“*”就表明該字符串代表文檔庫的邏輯名稱;否則如果頭兩個字母是“\\”就表明該字符串代表網(wǎng)絡(luò)路徑;否則如果頭五個字母是“MEM::”就表明該字符串代表內(nèi)存指針;否則尋找字符串的第一個“:”,如果該“:”后面是“//”該就表明字符串代表URL,否則就代表本地設(shè)備上的文件。對于打開服務(wù)器上的文檔庫的情形,可以設(shè)立一個專門的URL協(xié)議來區(qū)分,例如用“Docbase://myserver/mydoc2”指明打開服務(wù)器myserver上運(yùn)行的文檔庫系統(tǒng)服務(wù)器系統(tǒng)所管理的mydoc2文檔庫。
總之,只要能給字符串設(shè)置不同特征,就可以用不同的方式來指定文檔庫。根據(jù)上述說明,我們還可以定義各種不同的字符串特征;該方式不僅能應(yīng)用于指定文檔庫路徑,還能應(yīng)用于其它場合,特別是用來指定特定資源位置的應(yīng)用場合。在很多情況下,我們希望能夠用一種新方式來指定相關(guān)資源,但又不能或不希望改變現(xiàn)有的協(xié)議或函數(shù),這時就可以通過在字符串中設(shè)置不同特征的方式來指定,因為這種方法具有最好的通用性(任何協(xié)議或函數(shù),只要支持磁盤文件名或URL,就支持字符串)。
1.3返回值如果成功,則在UOML_RET中包含一個“handle”子元素,記錄句柄。
2.關(guān)閉(UOML_CLOSE)(圖12)2.1屬性無2.2子元素2.2.1handle對象句柄,是一個字符串表示的對象的引用指針。
2.2.2db_handle文檔庫句柄,字符串表示的文檔庫的引用指針。
2.3返回值無返回值3.UOML_GET獲取(參閱圖13)3.1屬性3.1.1usage用途,為”GetHandle”(獲取指定對象句柄)、”GetObj”(獲取指定對象數(shù)據(jù))、”GetPageBmp”(獲取版面位圖)中的一個3.2子元素
3.2.1parent父對象句柄,usage屬性為”GetHandle”時使用。
3.2.2pos位置順序號,usage屬性為”GetHandle”時使用。
3.2.3handle指定對象的句柄,當(dāng)usage屬性為”GetObj”時使用。
3.2.4page需要顯示的頁面的句柄,當(dāng)usage屬性為”GetPageBmp”時使用。
3.2.5input描述了對輸入頁面的約束,其中可以指定顯示一層或者多層的內(nèi)容(可以顯示的層一定是當(dāng)前角色有權(quán)限訪問的層);也可以通過指定Clip區(qū)域來指定顯示區(qū)域的大小。當(dāng)usage屬性為”GetPageBmp”時使用。
3.2.6output描述了版面位圖的輸出方式,當(dāng)usage屬性為”GetPageBmp”時使用。
3.3返回值3.3.1當(dāng)usage屬性為”GetHandle”時,執(zhí)行成功時在UOML_RET中包含一個“handle”子元素,記錄parent下第pos個子對象的句柄。
3.3.2當(dāng)usage屬性為”GetObj”時,執(zhí)行成功時在UOML_RET中包含一個“xobj”子元素,含有handle對象的數(shù)據(jù)的xml表示。
3.3.3當(dāng)usage屬性為”GetPageBmp”時,執(zhí)行成功時在output指定位置輸出版面位圖。
4.UOML_SET設(shè)置(參閱圖14)4.1屬性無4.2子元素4.2.1Handle設(shè)置對象的句柄4.2.2xobj對象的描述4.3返回值無返回值5.UOML_INSERT插入(參閱圖15)5.1屬性無5.2子元素5.2.1parent父對象句柄
5.2.2xobj對象的描述5.2.3pos插入位置5.3返回值如果執(zhí)行成功,則將xobj參數(shù)表示的對象,插入到parent中成為其第pos個子對象,并在UOML_RET中包含一個”handle”子元素,表示新插入對象的句柄。
6.UOML_DELETE 刪除(參閱圖16)6.1屬性無6.2子元素6.2.1handle需要刪除的對象的句柄。
6.3返回值無返回值7.UOML_QUERY檢索查詢(參閱圖17)7.1屬性無7.2子元素7.2.1handle需要查詢的文檔庫句柄7.2.2condition查詢條件7.3返回值如果成功,在UOML RET中包含一個“handle”子元素代表查詢結(jié)果的句柄,一個“number”子元素代表查詢結(jié)果的數(shù)量,可以用UOML_GET來獲取每一個查詢結(jié)果。
UOML對象包括文檔庫(UOML_DOCBASE)、文檔集(UOML_DOCSET)、文檔(UOML_DOC)、頁(UOML_PAGE)、層(UOML_LAYER)、對象組(UOML_OBJGROUP)、文字(UOML_TEXT)、圖像(UOML_IMAGE)、直線(UOML_LINE)、曲線(UOML_BEIZER)、圓弧(UOML_ARC)、路徑(UOML_PATH)、源文件(UOML_SRCFILE)、背景色(UOML_BACKCOLOR)、前景顏色(UOML_COLOR)、ROP(UOML_ROP)、字符尺寸(UOML_CHARSIZE)、字體(UOML_TYPEFACE)、角色(UOML_ROLE)、權(quán)限(UOML_PRIV)等。
以下我們以部分對象為例說明其定義方式1.UOML_DOC1.1屬性無1.2子元素1.2.1metadata元數(shù)據(jù)1.2.2pageset各頁面1.2.3fontinfo嵌入字庫1.2.4navigation導(dǎo)航信息1.2.5thread導(dǎo)讀信息1.2.6minipage微縮版面1.2.7signiture數(shù)字簽名1.2.8log歷史痕跡1.2.9shareobj文檔共享對象2.UOML_PAGE2.1屬性2.1.1resolution邏輯分辨率2.1.2size版心大小,用寬高表示2.1.3rotaion旋轉(zhuǎn)角度2.1.4log歷史痕跡2.2子元素2.2.1GS初始圖形狀態(tài),包括charstyle(字符風(fēng)格)、linestyle(線型)、linecap(線頭類型)、linejoint(接頭類型)、linewidth(線寬)、fillrule(填充規(guī)測)、charspace(字間距)、linespace(行間距)、charroate(字符旋轉(zhuǎn)角度)、charslant(字符傾斜方向)、charweight(字色重)、chardirect(字符方向)、textdirect(文本方向)、shadowwidth(陰影寬度)、shadowdirect(陰影方向)、shadowboderwidth(陰影邊線寬度)、outlinewidth(輪廓寬度)、outlineboderwidth(輪廓邊線寬度)、linecolor(線的顏色)、fillcolor(填充色)、backcolor(背景色)、textcolor(文字顏色)、shadowcolor(陰影顏色)、outlinecolor(輪廓線顏色)、matrix(變換矩陣)、cliparea(裁減區(qū))。
2.2.2metadata元數(shù)據(jù)2.2.3layerset屬于該頁的各層2.2.4signirure數(shù)字簽名2.2.5log歷史痕跡3.UOML_TEXT3.1屬性3.1.1Encoding文字編碼方式3.2子元素3.2.1TextData文字內(nèi)容3.2.2CharSpacingList對非等間距文字的字間距列表3.2.3StartPos起點位置4.UOML_CHARSIZE4.1屬性4.1.1width字符寬度4.1.2height字符高度4.2子元素?zé)o5.UOML_LINE5.1屬性5.1.1LineStyle線型5.1.2LineCap線的接頭類型5.2子元素5.2.1StartPoint線的起點坐標(biāo)5.2.2EndPoint線的終點坐標(biāo)
6.UOML_BEIZER6.1屬性6.1.1LineStyle線型6.2子元素6.2.1StartPoint貝塞爾曲線的起點坐標(biāo)6.2.2Control1_Point貝塞爾曲線的第一控制點6.2.3Control2_Point貝塞爾曲線的第二控制點6.2.4EndPoint貝塞爾曲線的終點坐標(biāo)7.UOML_ARC7.1屬性7.1.1ClockWise弧的方向7.2子元素7.2.1StartPoint弧的起點坐標(biāo)7.2.2EndPoint弧線的終點坐標(biāo)7.2.3Center弧的圓心坐標(biāo)8.UOML_COLOR8.1屬性8.1.1Type顏色類型,RGB或CMYK8.2子元素RGB模式8.2.1Red紅色8.2.2Green綠色8.2.3Blue藍(lán)色8.2.4Alpha透明度CMYK模式8.2.5Cyan青色8.2.6Magenta品紅
8.2.7Yellow黃色8.2.8Black_ink黑色以此類推,我們可以用同樣的方法來描述所有的UOML對象。當(dāng)應(yīng)用軟件對文檔庫進(jìn)行操作時,由上述UOML動作與UOML對象依照XML語法生成相應(yīng)的UOML命令。具體地,在本發(fā)明中,采用XML元素來描述動作,該元素下的子元素來描述具體對象,采用字符串來表示數(shù)值,并且對象的詳細(xì)信息采用屬性描述。通過這種形式,可以實現(xiàn)對功能調(diào)用和調(diào)用返回結(jié)果的XML描述。對該XML描述語義上的約束,采用DTD或schema。然后,將該UOML命令發(fā)給文檔庫系統(tǒng)即代表向文檔庫系統(tǒng)發(fā)出了相應(yīng)操作指令。XML(eXtensible Markup Language,可擴(kuò)展置標(biāo)語言)是由W3C(World WideWeb Consortium,互聯(lián)網(wǎng)聯(lián)合組織)于1998年2月發(fā)布的一種標(biāo)準(zhǔn),同HTML一樣是SGML(Standard Generalized Markup Language,標(biāo)準(zhǔn)通用置標(biāo)語言)的一個簡化子集。XML語法和各種對象操作指令可參見該標(biāo)準(zhǔn)。同時可以參考″Extensible Markup Language(XML)1.1,W3C Recommendation 04 February2004,edited in place 15 April 2004″、″W3C(World Wide Web Consortium)eXtensible Markup Language(XML)1.0(REC-xml-19980210)″、″W3C XMLSchema Part 0-4(REC-xmlschema)″、″W3C Namespaces in XML(REC-xml-names-199090114)″、″W3C XSL Transformations(XSLT)Version1.0(REC-xslt-19991116)″、″Document Object Model(DOM)Level 1Specification(Second Edition)Version 1.0,W3C Working Draft 29 September,2000″、″美國Federal CIO Council XML Working Group Draft Federal XMLDeveloper′s Guide″以及″英國Office of the e-Envoy,e-Government SchemaGuidelines for XML″。
例如,對創(chuàng)建文檔庫操作,可以用以下命令來完成<UOML_OPEN create=″true″>
<path val=″f:\\data\\docbasel.sep″/>
</UOML_OPEN>
對創(chuàng)建文檔集操作,可以用以下命令來完成
<UOML_INSERT>
<parent val=″123.456.789″/>
<pos val=″1″/>
<xobj>
<docset/>
</xobj>
</UOML_INSERT>
需要說明的是,雖然UOML是用XML定義的,但為了顯得更加簡潔,我們在前面省略了類似“<?xml version=″1.0″encoding=″UTF-8″?>”以及“xmlns:xsi=″http://www.w3.org/2001/XMLSchema-instance″”之類的常規(guī)XML格式,只要是熟悉XML語法的實施者都可以自行補(bǔ)充完整。
我們也可以不用XML方式定義命令串,例如改用類似PostScript那樣的方式,這樣上例變成這樣的1,″f:\\data\\docbase1.sep″,/Open/docset,1,“123.456.789”,/Insert根據(jù)同樣的思路,我們還可以定義出其它類型的命令串格式,甚至我們還可以不用文本方式,而用二進(jìn)制方式來定義命令串。
除了“動作+對象”方式外,我們也可以用其它方式定義命令串。例如,對每一個對象的每一個操作都用一個命令來表示,即用“UOML_INSERT_DOCSET”來表示插入一個文檔集,用“UOML_INSERT_PAGE”來表示插入一頁,我們以這樣的方式來定義每個命令UOML_INSERT_DOCSET在文檔庫中創(chuàng)建一個文檔集屬性無子元素parent文檔庫句柄pos插入位置返回值如果執(zhí)行成功,則在UOML_RET中包含一個”handle”子元素,表示新插入文檔集的句柄這樣上例就變?yōu)?amp;lt;UOML_INSERT_DOCSET>
<parent val=″123.456.789″/>
<pos val=″1″/>
</UOML_INSERT_DOCSET>
用這種方法定義命令格式的話就需要對每個對象的每種合法操作都單獨定義一條命令,會比較繁瑣。
接口標(biāo)準(zhǔn)也可以用函數(shù)調(diào)用的方式來實施,即通過上接口調(diào)用下接口的接口函數(shù)的方式來發(fā)送操作指令給文檔庫系統(tǒng)的以下以C++語言為例說明,該實施例稱為UOI。
我們先定義一個UOI返回值結(jié)構(gòu)struct UOI_Ret{BOOLm_bSuccess; //操作是否成功CString m_ErrInfo; //如果操作不成功,錯誤信息是什么};定義所有UOI對象的基礎(chǔ)類class UOI_Object{public:
enum Type{//類型定義TYPE_DOCBASE,//文檔庫TYPE_DOCSET,//文檔集TYPE_DOC,//文檔TYPE_PAGE,//頁TYPE_LAYER,//層TYPE_TEXT,//文字TYPE_CHARSIZE,//字符尺寸......對文檔模型中定義的其它對象的類型的定義與上面類似,以下省略。
};Typem_Type;//類型
UOI_Object();//構(gòu)造函數(shù)virtual~UOI_Object();//析構(gòu)函數(shù)static UOI_Object*Create(Type objType);//根據(jù)指定類型創(chuàng)建相應(yīng)對象};然后定義如下幾個UOI函數(shù),與第一個實施例中的幾個UOML動作相對應(yīng)打開或創(chuàng)建文檔庫,成功則將其句柄返回在pHandle中UOI_RET UOI_Open(char*path,BOOL bCreate,HANDLE*pHandle);關(guān)閉db_handle文檔庫中的handle句柄,如果handle為NULL則關(guān)閉整個文檔庫UOI_RET UOI_Close(HANDLE handle,HANDLE db_handle);獲取指定子對象句柄UOI_RET UOI_GetHandle(HANDLE hParent,int nPos,HANDLE*pHandle);獲取句柄所指向的對象的類型UOI_RET UOI_GetObjType(HANDLE handle,UOI_Object::Type*pType);獲取句柄所指向的對象數(shù)據(jù)UOI_RET UOI_GetObj(HANDLE handle,UOI_Object*pObj);獲取版面位圖UOI_RET UOI_GetPageBmp(HANDLE hPage,RECT rect,void*pBuf);設(shè)置對象UOI_RET UOI_SetObj(HANDLE handle,UOI_Object*pObj);插入對象UOI_RET UOI_Insert(HANDLE hParent,int nPos,UOI_Object*pObj,HANDLE*pHandle=NULL);刪除對象UOI_RET UOI_Delete(HANDLE handle);檢索查詢,檢索結(jié)果的數(shù)量返回在pResultCount中,檢索結(jié)果列表的句柄返回在phResult中UOI_RET UOI_Query(HANDLE hDocbase,const char *strCondition,HANDLE*phResult,int*pResultCount);然后定義各UOI對象,依然以UOI_Doc、UOI_Text和UOML_CharSize為例說明class UOI_Doc:public UOI_Object{public:
UOI_MetaData m_MetaData;//元數(shù)據(jù)int m_nPages;//頁數(shù)UOI_Page**m_pPages;//頁指針int m_nFonts;//字體數(shù)UOI_Font**m_pFonts;//字體列表UOI_Navigation m_Navigation;//導(dǎo)航對象UOI_Threadm_Thread;//導(dǎo)讀UOI_MiniPage*m_pMiniPages;//微縮頁面UOI_Signature m_Signature;//簽名intm_nShared;//共享對象數(shù)UOI_Obj*m_pShared;//共享列表UOI_poc();//構(gòu)造函數(shù)virtual~UOI_Doc();//解析函數(shù)};class UOI_Text:public UOI_Object{public:
enum Encoding{ENCODE_ASCII,//ascii編碼ENCODE_GB13000,//GB13000編碼ENCODE_UNICODE,//Unicode編碼......
};
Encoding m_Encoding;//編碼類型char*m_pText;//文字串Point m_Start;//起點坐標(biāo)int*m_CharSpace;//字符間距數(shù)組UOI_Text();//構(gòu)造virtual~UOI_Text();//析構(gòu)};//對象UOI_CharSize的定義class UOI_CharSize:public UOI_Object{public:
int m_Width;//寬度int m_Height;//高度UOI_CharSize();//構(gòu)造函數(shù)virtual~UOI_CharSize();//析構(gòu)函數(shù)};以下示例說明UOI的使用方法。首先是創(chuàng)建文檔庫操作ret=UOI_Open(″f:\\data\\docbasel.sep″,TRUE,&hDocBase);然后是構(gòu)建一個創(chuàng)建新對象的函數(shù)HANDLE InsertNewObj(HANDLE hParent,int nPos,UOI_Object::Type type){UOI_Retret;//返回值HADNLE handle;//對象句柄UOI_Obj*pNewObj=UOI_Obj::Create(type);//創(chuàng)建對象if(pNewObj==NULL)return NULL;//創(chuàng)建失敗返回空值ret=UOI_Insert(hParent,nPos,pNewObj,&handle);//插入到父結(jié)點,返回對象句柄handledelete pNewObj;//刪除臨時對象
return ret.m_bSuccess?handle:NULL;//成功返回對象句柄handle,失敗返回空值}然后是直接獲取對象的函數(shù)UOI_Obj*GetObj(HANDLE handle){UOI_Retret;//返回值UOI_Object::Type type;//對象類型UOI_Obj*pObj;//對象指針ret=UOI_GetObjType(handle,&type);//根據(jù)對象類型typeif(!ret.m_bSuccess)return NULL;//如果返回失敗,本函數(shù)返回空值pObj=UOI_Obj::Create(type);//創(chuàng)建type類型的對象if(pObj==NULL)return NULL;//如果新建對象為空,返回空值ret=UOI_GetObj(handle,pObj);獲取對象if(!ret.m_bSuccess){delete pObj;//失敗刪除臨時指針return NULL;}return pObj;//返回對象指針}我們還可以用非“動作+對象”的函數(shù)方式來定義接口標(biāo)準(zhǔn),例如對每一個對象的每一種操作都定義一個接口函數(shù),這樣插入文檔集的操作指令就是上接口以下列方式調(diào)用下接口的接口函數(shù)來發(fā)送給文檔庫系統(tǒng)的UOI_InsertDocset(pDocbase,0);我們還可以封裝各個對象類(如文檔庫類),把該對象可以進(jìn)行的操作定義成該類的方法,如class UOI_DocBase:publjc UOI_Obj
{public:
/*!*\brief創(chuàng)建文檔庫*\param szPath 文檔庫全路徑*\param bOverride是否覆蓋原文件*\return UOI_DocBase對象*/BOOL Create(const char*szPath,bool bOverride=false);/*!*\brief打開文檔庫*\param szPath文檔庫全路徑*\return UOI_DocBase對象*/BOOL Open(const char*szPath);/*!*\brief 關(guān)閉文檔庫*\param 無*\return 無*/void Close();/*!*\brief 獲取角色列表*\param 無*\returnUOI_RoleList對象*\sa UOI_RoleList*/UOI_RoleList GetRoleList();/*!
*\brief存儲文檔庫*\param szPath存儲文檔庫全路徑*\return 無*/void Save(char*szPath=0);/*!*\brief插入文檔集*\param nPos插入文檔集的位置*\returnUOI_DocSet對象*\sa UOI_DocSet*/UOI_DocSet InsertDocSet(int nPos);/*!*\brief獲取指定索引的文檔集*\paramnIndex文檔列表的索引號*\returnUOI_DocSet對象*\sa UOI_DocSet*/UOI_DocSet GetDocSet(int nIndex);/*!*\brief 獲取文檔集的總數(shù)*\param無*\return文檔集個數(shù)*/int GetDocSetCount();/*!*\brief設(shè)置文檔庫的名稱*\param nLen文檔庫名稱長度
*\param szName文檔庫名稱*\return無*/void SetName(int nLen,const char*szName);/*!*\brief獲取文檔庫名稱長度*\param無*\return長度*/int GetNameLen();/*!*\brief獲取文檔庫名稱*\param 無*\return文檔庫名稱*/const char*GetName();/*!*\brief獲取文檔庫id長度*\param 無*\return長度*/int GetIDLen();/*!*\brief獲取文檔庫id*\param無*\returnid*/const char*GetID();
//!構(gòu)造函數(shù)UOI_DocBase();//!析構(gòu)函數(shù)virtual~UOI_DocBase();};class UOI_Text:public UOI_Obj{public:
//!構(gòu)造函數(shù)UOI_Text();//!析構(gòu)函數(shù)virtual~UOI_Text();//!表示文本編碼的枚舉類型enum UOI_TextEncoding{CHARSET_GB2312,/*!<GB2312,a1a1-fefe*/CHARSET_HZ2312,/*!<GB2312 except GBFH,b0a1-fefe*/CHARSET_GB12345,/*!<GB12345,traditional char of GB2312,a1a1-fefe*/CHARSET_HZ12345,/*!<GB12345 except GBFH,traditional char of HZ2312,b0a1-fefe*/CHARSET_GB13000,/*!<GBK,8141-fefe*/CHARSET_HZ13000,/*!<GBK except GBFH,8141-fefe except a1a1-affe*/CHARSET_GB18030,/*!<GB18030 except GBFH,unsupported in this version*/CHARSET_HZ18030,/*!<GB18030 except GBFH,unsupported in this version*/CHARSET_UNICODE,/*!<UniCode,unsupported in this version*/CHARSET_ASCII,/*!<ASCII編碼*/};
//!獲得文本的編碼UOI_TextEncoding GetEncoding();//!設(shè)置文本的編碼void SetEncoding(UOI_TextEncoding nEncoding);//!獲得文本的數(shù)據(jù)const char*GetTextData();//!獲得文本的數(shù)據(jù)長度int GetTextDataLen();//!設(shè)置文本的數(shù)據(jù)/*!\param pData文本數(shù)據(jù)\param nLen數(shù)據(jù)長度*/void SetTextData(const char*pData,int nLen);//!獲得起點位置Point GetStartPoint();//!設(shè)置起點位置void SetStartPoint(Point startPoint);//!獲得字符間距表大小int GetCharSpacingCount();//!獲得字符間距表中指定位置的字符間距float GetCharSpacing(int nIndex);//!設(shè)置字符間距表大小bool SetCharSpacingCount(int nLen);//!設(shè)置字符間距bool SetCharSpacing(int nIndex,float charSpace);//!獲得文本的外框UOI_Rect GetExtentArea();};
class UOI_Arc:public UOI_Obj { //圓弧對象及其操作public:
//!構(gòu)造函數(shù)UOI_Arc();//!析構(gòu)函數(shù)virtual~UOI_Arc();//!獲得圓弧起點/*!\return圓弧起點*/UOI_Point GetStartPoint();//!獲得圓弧終點/*!\return圓弧終點*/UOI_Point GetEndPoint();//!獲得圓弧旋轉(zhuǎn)角/*!\return橢圓橫軸與坐標(biāo)系X軸的夾角,單位為弧度*/float GetRotAng();//!設(shè)置圓弧旋轉(zhuǎn)角/*!\param fRotAng新的旋轉(zhuǎn)角\sa GetRotAng()*/void SetRotAng(float fRotAng);//!獲得X半軸長度
float GetRadiusX();//!設(shè)置X半軸長度void SetRadiusX(float fRx);//!獲得Y半軸長度float GetRadiusY();//!設(shè)置Y半軸長度void SetRadiusY(float fRy);//!獲得弧線方向(是否為順時針)bool GetClockWise();//!設(shè)置弧線方向(是否為順時針)void SetClockWise(bool bClockWise);//!獲得(由圓弧起點->圓心->圓弧終點,是否為順時針方向)bool GetGreatArcFlag();//!設(shè)置(由圓弧起點->圓心->圓弧終點,是否為順時針方向)void SetGreatArcFlag(bool bGreat);//!計算圓心,由參數(shù)返回,如果數(shù)據(jù)無效,則返回false,否則返回truebool GetCenter(float&fCx,float&fCy);};class UOI_RoleList:public UOI_Obj//文檔庫中的角色列表{public:
//!獲得列表中角色的數(shù)目int GetRoleCount();//!按指定索引獲得角色UOI_Role*GetRole(int nIndex);//!創(chuàng)建角色/*!\param pPrivKey私鑰緩沖區(qū)
\param pnKeyLen用于返回實際私鑰的長度\return新創(chuàng)建的角色*/UOI_Role AddRole(unsigned char*pPrivKey,int*pnKeyLen);//!構(gòu)造函數(shù)UOI_RoleList();//!析構(gòu)函數(shù)virtual~UOI_RoleList();};class UOI_Role:public UOI_Obj //文檔庫中的角色{public:
//!構(gòu)造函數(shù)UOI_Role();//!析構(gòu)函數(shù)virtual~UOI_Role();//!獲得角色I(xiàn)Dint GetRoleID();//!設(shè)置角色I(xiàn)D/*!\param nID角色I(xiàn)D*/void SetRoleID(int nID);//!獲得角色名稱const char*GetRoleName();//!設(shè)置角色名稱/*!
\param szName角色名稱*/void SetRoleName(const char*szName);};class UOI_PrivList:public UOI_Obj//權(quán)限列表,每個權(quán)限列表由若干角色權(quán)限項組成{public:
//!獲得指定角色對應(yīng)的權(quán)限UOI_RolePriv*GetRolePriv(UOI_Role*pRole);//!新建某角色的權(quán)限項UOI_RolePriv*AddRole(UOI_Role*pRole);//!獲得列表中角色權(quán)限項的數(shù)目int GetRolePrivCount();//!按索引值,獲得角色權(quán)限項UOI_RolePriv*GetRolePriv(int nIndex);//!構(gòu)造函數(shù)UOI_PrivList();//!析構(gòu)函數(shù)virtual~UOI_PrivList();};class UOI_RolePriv:public UOI_Obj//角色權(quán)限項,對應(yīng)于某一個角色的所有權(quán)限,由若干針對某個對象的權(quán)限組成{public:
//!獲得角色UOI_Role*GetRole();//!設(shè)置對某個對象的權(quán)限,當(dāng)權(quán)限超過該角色對該對象的當(dāng)前權(quán)限時為授權(quán),小于時為收回授權(quán)。當(dāng)前登錄的角色必須有相應(yīng)的再授權(quán)或收回授權(quán)權(quán)限bool SetPriv(UOI_Obj*pObj,UOI_Priv*pPriv);//!獲得權(quán)限設(shè)置數(shù)量int GetPrivCount();//!獲得索引值對應(yīng)的權(quán)限設(shè)置的對象UOI_Obj*GetObj(jnt nIndex);//!獲得索引值對應(yīng)的權(quán)限設(shè)置的權(quán)限UOI_Priv*GetPriv(int nIndex);//!獲得對應(yīng)于某一個對象的的權(quán)限UOI_Priv*GetPriv(UOI_Obj*pObj);//!構(gòu)造函數(shù)UOI_RolePriv();//!析構(gòu)函數(shù)virtual~UOI_RolePriv();};class UOI_Priv:public UOI_Obj//權(quán)限的定義{public:
enum PrivType{ //各權(quán)限類型定義PRIV_READ, //讀權(quán)限PRIV_WRITE, //寫權(quán)限PRIV_RELICENSE, //再授權(quán)權(quán)限PRIV_BEREAVE,//收回授權(quán)權(quán)限PRIV_PRINT, //打印權(quán)限其它權(quán)限定義}//!是否有相應(yīng)權(quán)限bool GetPriv(PrjvType privType);
//!設(shè)置相應(yīng)權(quán)限void SetPriv(PrivType privType,bool bPriv);//!構(gòu)造函數(shù)UOI_Priv();//!析構(gòu)函數(shù)virtual~UOI_Priv();};class UOI_SignList:public UOI_Obj//數(shù)字簽名列表{public:
//!構(gòu)造函數(shù)UOI_SignList();//!析構(gòu)函數(shù)virtual~UOI_SignList();//!添加新的數(shù)字簽名,返回其索引值int AddSign(UOI_Sign*pSign);//!按指定索引值,獲得指定數(shù)字簽名UOI_Sign*GetSign(int index);//!按索引值,刪除指定數(shù)字簽名void DelSign(int index);//!獲得列表中數(shù)字簽名的數(shù)目int GetSignCount();};class UOI_Sign:public UOI_Obj//數(shù)字簽名{public:
//!構(gòu)造函數(shù)UOI_Sign();//!析構(gòu)函數(shù)virtual~UOI_Sign();//!執(zhí)行簽名/*!\param pDepList簽名所依賴的列表\param pRole用于簽名的角色\param pObj被簽名的對象*/void Sign(UOI_SignDepList*pDepList,UOI_Role*pRole,UOI_Obj*pObj);//!驗證簽名bool Verify();//!獲得簽名的依賴列表UOI_SignDepList*GetDepList();};class UOI_SignDepList:public UOI_Obj //簽名的依賴列表{public:
//!構(gòu)造函數(shù)UOI_SignDepList();//!析構(gòu)函數(shù)virtual~UOI_SignDepList();//!加入一個依賴項void InsertSignDep(UOI_Sign*pSign);//!獲得依賴項的數(shù)目
int GetDepSignCount();//!按指定索引值,獲得依賴項UOI_Sign*GetDepSign(int nIndex);//!按索引值,刪除指定依賴項bool*DelDepSign(int nIndex);};這樣插入文檔集的操作指令就是上接口以下列方式調(diào)用下接口的接口函數(shù)來發(fā)送給文檔庫系統(tǒng)的pDocBase.InsertDocset(0);我們還可以用同樣的方法為Java、C#、VB、Delphi等各種編程語言開發(fā)的應(yīng)用軟件設(shè)計各種不同的接口標(biāo)準(zhǔn)。
只要在接口標(biāo)準(zhǔn)中不含有與特定的操作系統(tǒng)(如WINDOWS、UNIX/LINUX、MAC OS、SYMBIAN)或特定的硬件平臺(如x86CPU、MIPS、POWER PC等)相關(guān)連的特征,該接口標(biāo)準(zhǔn)就可以具有跨平臺性,使得不同平臺上運(yùn)行的應(yīng)用軟件和文檔庫系統(tǒng)都可以統(tǒng)一使用同樣的接口標(biāo)準(zhǔn),特別是可以讓一個平臺上運(yùn)行的應(yīng)用軟件可以調(diào)用另一個平臺上運(yùn)行的文檔庫系統(tǒng)來執(zhí)行相應(yīng)操作。例如,應(yīng)用軟件部署在客戶端,使用的是PC機(jī),Windows操作系統(tǒng),文檔庫系統(tǒng)部署在服務(wù)器端,使用的是大型機(jī),Linux操作系統(tǒng),但應(yīng)用軟件依然可以像調(diào)用本地文檔庫系統(tǒng)一樣調(diào)用服務(wù)器上的文檔庫系統(tǒng)來執(zhí)行相應(yīng)文檔操作。
如果在接口標(biāo)準(zhǔn)中不含有與特定編程語言相關(guān)的特征,則該接口標(biāo)準(zhǔn)還能做到與編程語言無關(guān)??梢钥闯?,用命令串的方式容易構(gòu)造與平臺無關(guān)、與編程語言無關(guān)的接口標(biāo)準(zhǔn),更具有通用性。特別是用XML來構(gòu)造命令串的話,由于目前在各種不同平臺、不同編程語言都存在易于獲得的XML生成解析工具,因此不僅該接口標(biāo)準(zhǔn)具有很好的跨平臺性和與編程語言無關(guān)性,也非常便于工程師開發(fā)上接口部和下接口部。
以上列舉了多種接口標(biāo)準(zhǔn)的實施方法,按照類似的思路,不難設(shè)計出更多種類的接口標(biāo)準(zhǔn)。
接口標(biāo)準(zhǔn)可以在上述實施例的基礎(chǔ)上按同樣的思路增加操作指令,也可以簡化操作指令,特別是文檔模型被簡化時操作指令也會相應(yīng)被簡化。最簡化情況下只有文檔的創(chuàng)建、頁面的創(chuàng)建、各版面對象的創(chuàng)建這幾個操作指令。
現(xiàn)在,返回圖1,繼續(xù)描述依照本發(fā)明的文檔操作系統(tǒng)的工作過程。
應(yīng)用軟件可以是具有符合接口標(biāo)準(zhǔn)的上接口部的任意軟件,例如Office軟件、內(nèi)容管理、資源采集等。任一應(yīng)用軟件在需要對文檔進(jìn)行操作時,依照前述方法將指令傳遞給文檔庫系統(tǒng),文檔庫系統(tǒng)根據(jù)指令來完成具體操作過程。
文檔庫系統(tǒng)可以自由地存儲、組織文檔庫數(shù)據(jù),例如可以把一個文檔庫的文件全部都存儲在一個磁盤文件中;可以一個文檔對應(yīng)一個磁盤文件,利用操作系統(tǒng)中的文件系統(tǒng)功能實現(xiàn)多文檔組織;也可以一頁對應(yīng)一個磁盤文件;還可以完全拋開操作系統(tǒng),在磁盤上留出一塊空間后直接對磁道、扇區(qū)進(jìn)行管理。對文檔庫數(shù)據(jù)的存儲格式,可以用二進(jìn)制格式保存,可以用XML,還可以用二進(jìn)制XML。頁面描述語言(定義頁面上的文字、圖形、圖像等對象的方法)可以用PostScript,可以用PDF,可以用SPD(書生公司使用的頁面描述語言),當(dāng)然也可以自定義。總之,只要能夠?qū)崿F(xiàn)接口標(biāo)準(zhǔn)所定義的功能,任何實現(xiàn)方式都是可以的。
例如,我們可以用XML來描述文檔庫數(shù)據(jù),當(dāng)文檔模型是層次型的時候,可以完全對照建立相應(yīng)的XML樹。執(zhí)行創(chuàng)建操作時就在XML樹中增加一個結(jié)點,執(zhí)行刪除操作就刪掉相應(yīng)結(jié)點,執(zhí)行設(shè)置操作就設(shè)置相應(yīng)結(jié)點的屬性,執(zhí)行獲取操作就取出相應(yīng)結(jié)點的屬性并返回給應(yīng)用軟件,執(zhí)行查詢操作時就遍歷相關(guān)結(jié)點查找。
以下是該實施例的進(jìn)一步說明1.用XML來描述每個對象。也就是說,為每個對象按照其XML Schema建立一個對應(yīng)的XML樹。有的對象屬性比較簡單,其對應(yīng)的XML樹就只有根結(jié)點,有的對象比較復(fù)雜,其對應(yīng)的XML樹還有子結(jié)點。具體描述方法可以參見前面用XML來定義操作對象的說明。
2.當(dāng)新建一個文檔庫時就新建一個根結(jié)點為文檔庫對象的XML文件。
3.每當(dāng)在文檔庫中插入一個對象時(如文字對象),就將該對象對應(yīng)的XML樹插入到插入位置的父結(jié)點(如層)之下。這樣,文檔庫中的每個對象都在文檔庫為根結(jié)點的XML樹中有一個對應(yīng)的結(jié)點。
4.當(dāng)刪除一個對象時,就刪除該對象對應(yīng)的結(jié)點,其下屬所有子結(jié)點也都被刪除。刪除過程是從葉子結(jié)點開始自下而上遍歷的。
5.設(shè)置一個對象屬性時,將該對象對應(yīng)的結(jié)點的屬性設(shè)置成該屬性。如果該屬性是用子結(jié)點表示的,則設(shè)置對應(yīng)的子結(jié)點。
6.獲取一個對象屬性時,訪問該對象對應(yīng)的結(jié)點,根據(jù)該結(jié)點的屬性和子結(jié)點獲得該對象的屬性。
7.獲取一個對象的句柄時,返回該對象對應(yīng)結(jié)點的XML路徑。
8.復(fù)制一個對象(如頁面)到指定位置時,就將該對象對應(yīng)的結(jié)點開始的整個子樹都復(fù)制到目標(biāo)位置對應(yīng)的父結(jié)點(如文檔)之下。如果是復(fù)制到另一個文檔庫中,則需要將該子樹引用的對象(如嵌入字庫)也一起復(fù)制過去。
9.執(zhí)行獲取版面信息指令時,先生成一個指定位圖格式的空白位圖,其尺寸和指定區(qū)域相同,然后遍歷指定頁面的所有版面對象,凡是位于指定區(qū)域內(nèi)(包括只有一部分在該區(qū)域內(nèi))的版面對象,都解釋其含義,并在版面上相應(yīng)體現(xiàn)。具體過程雖然比較復(fù)雜比較專業(yè),但均屬于現(xiàn)有RIP技術(shù)范疇,不在此贅述。
10.在創(chuàng)建角色對象時,生成一對隨機(jī)PKI鑰對(例如512位的RSA密鑰),將公鑰存儲在角色對象中,將私鑰返回給應(yīng)用軟件。
11.當(dāng)應(yīng)用軟件登錄時,隨機(jī)生成一塊(例如128字節(jié))數(shù)據(jù),用相應(yīng)角色對象中的公鑰加密該數(shù)據(jù)發(fā)給應(yīng)用軟件,應(yīng)用軟件解密后比較驗證,如果正確則表明應(yīng)用軟件確實擁有該角色對應(yīng)的私鑰,登錄成功。為保險起見,該認(rèn)證過程可以重復(fù)三次,三次全部通過才算登錄成功。
12.當(dāng)對某一對象進(jìn)行簽名時,也就是對其對應(yīng)的結(jié)點開始的子樹進(jìn)行簽名。為了能夠使簽名不受具體物理存儲方式的影響,需要先做一個正則化,使得邏輯上等效的變化(例如存儲位置的改變導(dǎo)致相應(yīng)指針的變化)不會影響簽名有效性。該正則化的方法如下a)對樹的某一結(jié)點,先將該結(jié)點的子結(jié)點數(shù)計算HASH值,然后再依次計算其類型和各個屬性的HASH值,按順序連接在子結(jié)點數(shù)HASH值的后面。對連接的結(jié)果再計算其HASH值,得到該結(jié)點的正則結(jié)果;b)從子樹的根節(jié)點開始,按照上述方法計算該結(jié)點的正則結(jié)果,并對其所有子結(jié)點,按照從左到右順序依次計算其正則結(jié)果,將子結(jié)點的正則結(jié)果按順序附加到父結(jié)點正則結(jié)果之后;c)這是一個深度優(yōu)先的遞歸過程。遞歸結(jié)束之后,即得到最終結(jié)果。
d)如果需要對被引用的對象也一起做簽名,則可以將被引用對象也作為一個子結(jié)點處理,方法同上。
正則化以后,再做HASH并用角色的私鑰進(jìn)行簽名就屬于現(xiàn)有技術(shù)了。
在上述正則化過程中,我們可以把a(bǔ))改成如下方案對樹的某一結(jié)點,將該結(jié)點的子結(jié)點數(shù)、類型及其各屬性用分隔符隔開后按照順序連接起來,對連接的結(jié)果計算其HASH值,得到該結(jié)點的正則結(jié)果;我們還可以把a(bǔ))改成如下方案對樹的某一結(jié)點,其子結(jié)點數(shù)、類型及其各屬性的長度用分隔符隔開后按照順序連接起來,再與子結(jié)點數(shù)、類型、各屬性連接起來,即為該結(jié)點的正則結(jié)果;總之,a)可以是以下各種方案中的任意一種對樹的某一結(jié)點,其子結(jié)點數(shù)、類型、各屬性,子結(jié)點數(shù)/類型/各屬性的長度(可選的),原值或經(jīng)過特定變換(如HASH、壓縮),按照預(yù)定順序連接起來(直接連接或用分隔符隔開)。
上述預(yù)定順序的意思是,子結(jié)點數(shù)長度、類型長度、各屬性長度、子結(jié)點數(shù)、類型、各屬性可以按任意順序排列,只要是預(yù)定的順序即可,b)、c)步驟也可以改為寬度優(yōu)先。
我們不難給出上述方案的各種變化方式,如每個結(jié)點的子結(jié)點數(shù)用分隔符隔開后按照深度優(yōu)先的順序連接起來,再與各結(jié)點其它數(shù)據(jù)的正則結(jié)果連接起來??傊?,只要對該子樹中的所有結(jié)點的子結(jié)點數(shù)、類型和各屬性,按照確定的方法排列在一起就屬于本實施例的變形。
13.當(dāng)對某一對象設(shè)置權(quán)限時,最簡單的實現(xiàn)方式是簡單記錄各角色對該對象(及其子對象)的權(quán)限,并在今后各角色訪問時加以比較,符合權(quán)限的則允許相應(yīng)操作,否則報錯返回。更好的實現(xiàn)方式是對相應(yīng)數(shù)據(jù)加密,并用密鑰來控制權(quán)限,如果該角色沒有相應(yīng)密鑰就沒有對應(yīng)的權(quán)限,這種方式抗攻擊能力要更強(qiáng)。具體方案為a)對受保護(hù)的數(shù)據(jù)區(qū)域(通常為一個子樹,對應(yīng)某對象及其所有子對象),有一對對應(yīng)的PKI密鑰對,用其中的加密密鑰對該數(shù)據(jù)區(qū)域進(jìn)行加密;b)對具有讀權(quán)限的角色,授予其解密密鑰,該角色可以用該密鑰解密該數(shù)據(jù)區(qū)域,從而正確讀取這些數(shù)據(jù);c)對具有寫權(quán)限的角色,將授予其加密密鑰,該角色可以將修改后的數(shù)據(jù)用該密鑰加密,從而可以正確寫入該區(qū)域的數(shù)據(jù);d)鑒于PKI的加密/解密效率較低,為提高運(yùn)行效率,也可以用對稱密鑰來對該數(shù)據(jù)區(qū)域加密,加密密鑰用于對該對稱密鑰進(jìn)行加密,解密密鑰用于解密經(jīng)過加密后的密鑰數(shù)據(jù),從而獲得正確的對稱密鑰。為防止只有讀權(quán)限的角色在獲得對稱密鑰后用其修改數(shù)據(jù),可以用加密密鑰來對該數(shù)據(jù)區(qū)域進(jìn)行數(shù)字簽名,每次擁有寫權(quán)限的角色修改該數(shù)據(jù)區(qū)域后都重新做一次簽名,從而確保數(shù)據(jù)不會被沒有寫權(quán)限的角色篡改;e)當(dāng)授予某一角色加密密鑰或解密密鑰時,可以用該角色的公鑰對該密鑰加密后存儲,這樣只有擁有該角色的私鑰時才能取出該密鑰。
以下進(jìn)一步說明增強(qiáng)系統(tǒng)安全性和文檔安全性的技術(shù)實施方案角色由一個唯一的ID號和一對唯一的PKI密鑰組成,但在角色對象中只存儲其ID號和公鑰,私鑰由應(yīng)用軟件掌握。ID號可以是任意的編號或字符串,只要不同角色都分配了不同的ID即可。PKI算法可以是ECC、RSA中的一種。
安全管理功能由角色管理單元、安全會話通道單元、身份認(rèn)證單元、訪問控制單元、簽名單元組成。
以某個角色(或多個角色)登錄、執(zhí)行一系列操作、最后注銷的整個過程稱為會話。會話包括會話標(biāo)志、登錄角色列表。會話可以通過一個安全會話通道進(jìn)行。安全會話通道有一個會話密鑰,用于加密雙方之間傳遞的數(shù)據(jù)。會話密鑰可以用非對稱密鑰,但一般常用效率更高的對稱密鑰。
身份認(rèn)證單元用于當(dāng)角色登錄時,對登錄的身份進(jìn)行認(rèn)證。身份認(rèn)證的單位是角色,只有擁有某個角色的私鑰才能以這個角色的身份登錄。在登錄時,身份認(rèn)證單元根據(jù)登錄角色的ID取出存儲在角色對象中的角色公鑰,按照前述的“挑戰(zhàn)-應(yīng)答”機(jī)制進(jìn)行認(rèn)證。
角色管理單元包括角色的創(chuàng)建、各角色的權(quán)限的授權(quán)、收回授權(quán)等。
訪問控制單元,用于對文檔數(shù)據(jù)設(shè)置訪問控制權(quán)限,角色只能根據(jù)自己的訪問控制權(quán)限訪問文檔數(shù)據(jù)。我們甚至可以連權(quán)限數(shù)據(jù)都可以置于訪問控制的管理之下,這樣有的角色可以獲取其他人的權(quán)限,有的角色不能。但只有擁有再授權(quán)或收回授權(quán)權(quán)限的角色才能按照正常的再授權(quán)或收回授權(quán)方式改變角色的權(quán)限,而不允許直接寫入權(quán)限數(shù)據(jù)。
以下詳細(xì)說明各操作步驟1.新建一文檔庫時,角色管理單元自動將該文檔庫的缺省角色的權(quán)限設(shè)置為擁有所有權(quán)限,包括對所有對象的讀、寫、再授權(quán)和收回授權(quán)權(quán)限2.建立安全會話通道,啟動會話a)根據(jù)會話標(biāo)志判斷是否已經(jīng)啟動會話,如果是,則完成建立安全會話通道的過程,否則繼續(xù);b)一方生成一對隨機(jī)PKI鑰對;c)將公鑰發(fā)送給對方;d)對方生成隨機(jī)對稱密鑰作為會話密鑰,并用該公鑰加密會話密鑰后傳回;e)用私鑰解密出會話密鑰;f)設(shè)置會話標(biāo)志;g)將登錄角色列表設(shè)置為缺省角色;3.角色登錄a)應(yīng)用軟件提供所要登錄角色的ID和所登錄的文檔庫;b)身份認(rèn)證單元檢查會話中的登錄角色列表,如果該角色已經(jīng)登錄(包括缺省角色),則該步驟已經(jīng)完成,否則繼續(xù);c)身份認(rèn)證單元取出存儲在角色對象中的角色公鑰;d)身份認(rèn)證單元生成一段隨機(jī)數(shù)據(jù)塊,用該角色的公鑰對該數(shù)據(jù)塊進(jìn)行加密;e)身份認(rèn)證單元將加密后的數(shù)據(jù)塊發(fā)送給應(yīng)用軟件;
f)應(yīng)用軟件用該角色的私鑰進(jìn)行解密,將解密后的數(shù)據(jù)發(fā)送給身份認(rèn)證單元;g)身份認(rèn)證單元判斷傳回的數(shù)據(jù)是否正確,如果不正確則登錄失敗,否則繼續(xù);h)在會話的登錄角色列表中增加該角色。
4.創(chuàng)建新角色a)應(yīng)用軟件發(fā)出創(chuàng)建新角色指令;b)角色管理單元生成一個唯一的角色I(xiàn)D號;c)角色管理單元生成一對隨機(jī)的PKI鑰對;d)角色管理單元在文檔庫中創(chuàng)建一個角色對象,在角色對象中存儲上述ID號和公鑰,該角色的權(quán)限為空,即對所有對象都不擁有任何權(quán)限;e)將ID號和私鑰返回給應(yīng)用軟件。
5.對角色R授與對對象O的權(quán)限Pa)應(yīng)用軟件發(fā)出授權(quán)請求;b)角色管理單元計算登錄角色列表中所有角色對O的權(quán)限的并集,判斷該并集是否是P的超集并同時擁有再授權(quán)權(quán)限。如果否則授權(quán)失敗(所有角色都加在一起也沒有授權(quán)所需要的權(quán)限),否則繼續(xù);c)角色管理單元將對O的權(quán)限P增加到角色R的權(quán)限列表中。如果P不包含讀或?qū)懙臋?quán)限,則授權(quán)完成,否則繼續(xù);d)訪問控制單元單元檢查對象O是否已經(jīng)設(shè)置了讀寫的訪問控制權(quán)限。如果否,則i.生成隨機(jī)對稱密鑰和隨機(jī)PKI密鑰ii.用對稱密鑰對O進(jìn)行加密。如果O的各級子對象中有已經(jīng)設(shè)置了讀寫訪問控制權(quán)限的,則該子對象保持不變iii.用PKI加密密鑰加密對稱密鑰,存儲加密后的密文,并對O進(jìn)行簽名iv.檢查文檔庫中的所有角色,凡是對O具有讀權(quán)限的(這時O是該角色擁有讀權(quán)限的某個對象的子對象),用該角色的公鑰對解密密鑰進(jìn)行加密,將加密后的密文存儲到該角色的權(quán)限列表中;凡是對O具有寫權(quán)限的(這時O是該角色擁有讀權(quán)限的某個對象的子對象),用該角色的公鑰對加密密鑰進(jìn)行加密,將加密后的密文存儲到該角色的權(quán)限列表中v.轉(zhuǎn)到步驟he)從當(dāng)前登錄的角色中,選擇對O具備相應(yīng)權(quán)限的角色;f)將該角色權(quán)限列表中O的對應(yīng)密鑰(讀權(quán)限對應(yīng)解密密鑰,寫權(quán)限對應(yīng)加密密鑰,可讀可寫則包含兩個密鑰)的密文,發(fā)送給應(yīng)用軟件;g)應(yīng)用軟件用該角色的私鑰解密出密鑰,返回給訪問控制單元;h)根據(jù)P的設(shè)定,使用目標(biāo)角色R的公鑰,加密相應(yīng)的密鑰,生成對應(yīng)的密文,并存儲到R的權(quán)限列表中。
6.收回R對對象O的權(quán)限Pa)應(yīng)用軟件發(fā)出收回授權(quán)請求;b)角色管理單元查找登錄角色列表中的所有角色,是否有對O的收回授權(quán)的權(quán)限。如果都沒有,則收回授權(quán)失敗,否則繼續(xù);c)從R對O的權(quán)限中去掉P;d)如果P包含讀或?qū)憴?quán)限,從R的權(quán)限列表中刪除對O的相應(yīng)解密密鑰和/或加密密鑰。
7.讀取對象Oa)應(yīng)用軟件發(fā)出需要讀取O的操作的指令;b)訪問控制單元檢查登錄角色列表中所有角色對O的權(quán)限,確認(rèn)是否至少有一個角色對O有讀權(quán)限。如果均無,則失敗,否則繼續(xù);c)檢查對象O是否已經(jīng)設(shè)置了讀寫的訪問控制權(quán)限。如果否,則檢查其父對象,還不是的話則再檢查父對象的父對象,直到找到了設(shè)置讀寫訪問控制權(quán)限的對象;d)選擇一個對該對象有讀權(quán)限的角色;e)將該角色權(quán)限列表中保存的該對象的解密密鑰的密文,發(fā)送給應(yīng)用軟件;f)應(yīng)用軟件用該角色的私鑰解密出解密密鑰,返回給訪問控制單元;g)訪問控制單元用該解密密鑰解密出該對象的對稱密鑰;
h)用該對稱密鑰解密出對象O的數(shù)據(jù);i)將解密后的數(shù)據(jù)返回給應(yīng)用軟件。
8.寫對象Oa)應(yīng)用軟件發(fā)出需要修改O的操作的指令;b)訪問控制單元檢查登錄角色列表中所有角色對O的權(quán)限,確認(rèn)是否至少有一個角色對O有寫權(quán)限。如果均無,則失敗,否則繼續(xù);c)檢查對象O是否已經(jīng)設(shè)置了讀寫的訪問控制權(quán)限。如果否,則檢查其父對象,還不是的話則再檢查父對象的父對象,直到找到了設(shè)置讀寫訪問控制權(quán)限的對象O1;d)選擇一個對O1有寫權(quán)限的角色;e)將該角色權(quán)限列表中保存的O1的加密密鑰的密文,發(fā)送給應(yīng)用軟件;f)應(yīng)用軟件用該角色的私鑰解密出O1的加密密鑰,返回給訪問控制單元;g)用該加密密鑰加密O的新數(shù)據(jù)(如果O的各級子對象中有已經(jīng)設(shè)置了讀寫訪問控制權(quán)限的,則仍然用其密鑰對該子對象加密);h)用加密后的數(shù)據(jù)覆蓋原數(shù)據(jù),完成寫入過程。
9.對對象O進(jìn)行簽名a)應(yīng)用軟件發(fā)出對O進(jìn)行簽名的指令;b)簽名單元用前面所述的方法對對象O的數(shù)據(jù)進(jìn)行正則化;c)計算正則化結(jié)果的HASH值;d)將HASH值發(fā)給應(yīng)用軟件;e)應(yīng)用軟件用登錄角色列表中所有角色的私鑰對該HASH值進(jìn)行加密(即簽名);f)應(yīng)用軟件將簽名結(jié)果返回給簽名單元;g)簽名單元將簽名結(jié)果保存在數(shù)字簽名對象中。
10.注銷登錄角色a)應(yīng)用軟件發(fā)出注銷某個登錄角色的指令;b)如果登錄角色列表中存在該角色,安全會話通道單元將該角色從登錄角色列表中去掉。
11.結(jié)束會話a)一方發(fā)出結(jié)束會話請求;b)停止一切與當(dāng)前會話相關(guān)的線程,消除會話標(biāo)志,刪除登錄角色列表。
為了提高工作效率,在實施時還可以對上述方法進(jìn)行增強(qiáng)、簡化和變化,例如分解或合并各組成單元、將某個組成單元的某個功能調(diào)整為由另一各組成單元來完成、將各角色私鑰緩存在會話數(shù)據(jù)中(會話結(jié)束后刪除),而不用每次都需要發(fā)到應(yīng)用軟件進(jìn)行解密,或者省略一些安全措施,或者減少一些功能。總之,任何對上述方法進(jìn)行簡化、變化的方法都是本方法的變形。
本發(fā)明中所說明的文檔安全技術(shù),例如基于角色的權(quán)限管理、安全會話通道、角色的認(rèn)證方式、多重角色登陸、對樹結(jié)構(gòu)的正則化技術(shù)、細(xì)粒度的權(quán)限管理單元、基于加密的權(quán)限設(shè)置等,都不僅適用于本發(fā)明所述的文檔處理系統(tǒng),還可以運(yùn)用于更為廣泛的其它應(yīng)用場合。
在本發(fā)明中,為了使本文檔處理系統(tǒng)能很好地模擬紙張的特性,提供了一種“只加不改”的技術(shù)方案。也就是說,每個應(yīng)用軟件都只在現(xiàn)有文檔內(nèi)容基礎(chǔ)上添加新的內(nèi)容,但不修改、不刪除已有的內(nèi)容,使文檔的一個頁面就象一張紙一樣,可以由不同的人用不同的筆在紙上不斷寫寫畫畫,但誰都不能修改、刪除已有內(nèi)容。具體方法是每個文檔的每一層只由一個應(yīng)用軟件來管理和維護(hù),即每一個應(yīng)用軟件在編輯其它軟件生成的文檔時,都在現(xiàn)有文檔基礎(chǔ)上新增加一層,將本軟件新編輯的內(nèi)容都放到這一層中,不修改和刪除前面各層的內(nèi)容。由于現(xiàn)有社會就是基于紙張來運(yùn)轉(zhuǎn)的,因此只要能符合紙張的特性就能滿足現(xiàn)有應(yīng)用的需求,具備足夠的實用價值。
為了確保每一層內(nèi)容在生成后沒有被修改、刪除,我們可以利用每一層的數(shù)字簽名對象。數(shù)字簽名可以是對本層內(nèi)容進(jìn)行簽名,更可以是對本層以及本層下面(即更早創(chuàng)建的)的所有層的內(nèi)容一起簽名。簽名以后并不妨礙對文檔做進(jìn)一步的批注等編輯,只要新的內(nèi)容是位于新建的層,沒有修改破壞簽名時存在的各層,簽名依然是有效的,但簽名者只對簽名以前的內(nèi)容負(fù)責(zé),不對簽名以后的內(nèi)容負(fù)責(zé)。這是一個非常符合應(yīng)用需求的技術(shù)方案,具有很大的實用價值。相比之下,現(xiàn)有的其它技術(shù)或者簽名后不允許編輯,或者編輯后(盡管是“只加不改”的編輯)簽名被破壞。
前述技術(shù)方案不允許修改文檔中的已有內(nèi)容,即使不考慮與紙張?zhí)匦缘募嫒菀约皵?shù)字簽名問題,需要修改的話也只能做版面級編輯,即對每個版面對象的編輯(增、刪、改)都不會改變其它版面對象(這是由于通用文檔模型是基于可見部分為基礎(chǔ)構(gòu)建的,不包含大量不可見的、關(guān)于版面對象之間的關(guān)系,因此修改任何一個版面對象時,其它版面對象不會產(chǎn)生相應(yīng)的調(diào)整,例如刪掉一個字,就會在其位置留下空白,右邊的文字不會自動左移)。如果用戶需要對文檔中的已有內(nèi)容進(jìn)行編輯,并且還希望能像在原來那樣編輯的話,有一個技術(shù)方案可以很好地滿足這個應(yīng)用需求。該方案是當(dāng)應(yīng)用軟件完成初始編輯時,除了新建一層存放當(dāng)前編輯的內(nèi)容外,還將源文件(按照應(yīng)用軟件自有的格式存儲,記錄了各對象之間完整關(guān)系的文件,例如.doc文件)嵌入到文檔中。當(dāng)下次需要進(jìn)行繼續(xù)編輯時,從文檔中取出該源文件,并使用該源文件繼續(xù)編輯。編輯完成后清除該軟件所管理的那一層,重新生成該層的內(nèi)容,并繼續(xù)將新修改的源文件嵌入到文檔中。
具體方法如下1.應(yīng)用軟件第一次處理該文檔時,新建一層,將新編輯內(nèi)容對應(yīng)的版面對象插入到新建層中,同時用自身格式另存一份新編輯的內(nèi)容(即源文件);2.在文檔對象中新建一個源文件子對象,用來嵌入源文件(例如用二進(jìn)制數(shù)據(jù)的方式整體嵌入),并記錄是哪一層對應(yīng)該源文件對象;3.用同一應(yīng)用軟件再次編輯該文檔時,從對應(yīng)的源文件對象中取出對應(yīng)的源文件;4.使用該源文件繼續(xù)編輯該層內(nèi)容。由于該源文件是該應(yīng)用軟件自身的格式,可以按照該應(yīng)用軟件自身的功能繼續(xù)對該層內(nèi)容進(jìn)行編輯;5.再次編輯結(jié)束后,根據(jù)新編輯后的結(jié)果更新該層內(nèi)容(例如用全部清除后全部重新生成的方式),同時將新修改后的源文件重新嵌入到文檔對象中;6.如此循環(huán)往復(fù),就可以用原有應(yīng)用軟件按照原有方式對文檔中的已有內(nèi)容進(jìn)行編輯。
采用上述技術(shù)方案,可以最大程度地實現(xiàn)文檔的互操作性。在應(yīng)用軟件、文檔都采用本發(fā)明技術(shù)時,可以實現(xiàn)(如果有足夠安全權(quán)限的話)1.對任何文檔,用任何應(yīng)用軟件都可以正確打開、顯示、打?。?.對任何文檔,用任何應(yīng)用軟件都可以新添加任何內(nèi)容,而且不會破壞文檔已有簽名;3.對任何文檔,在不必考慮文檔已有簽名(沒有簽名或者雖有簽名但允許破壞)的前提下,用任何應(yīng)用軟件都可以對文檔已有內(nèi)容進(jìn)行版面級編輯;4.對任何文檔,使用文檔已有內(nèi)容的原始編輯軟件可以對該內(nèi)容進(jìn)行正常編輯。
由此可見,通過本發(fā)明中對層的管理,對文檔的管理、互操作、安全設(shè)置都帶來極大的便利。
下面我們以A軟件創(chuàng)建一個文檔并且B軟件對其進(jìn)行編輯為例說明其工作過程。為了節(jié)約篇幅起見,在本例中我們選用UOI作為接口標(biāo)準(zhǔn)1.A軟件發(fā)出指令,創(chuàng)建文檔庫c:\sample\mydocbase.sep,將其句柄存放在hDocBaseUOI_Open(“c:\\sample\\mydocbase.sep”,TRUE,&hDocBase);文檔庫系統(tǒng)執(zhí)行該指令,創(chuàng)建一個文件名為c:\sample\mydocbase.sep的新的XML文件,其根結(jié)點為文檔庫對象,將其句柄返回給應(yīng)用軟件。
2.A軟件發(fā)出指令,在文檔庫hDocBase中新建文檔集,將其句柄存放在hDocSethDocSet=InsertNewObj(hDocBase,0,UOI_Obj::TYPE_DOCSET);文檔庫系統(tǒng)執(zhí)行該指令,在文檔庫對象結(jié)點下添加一個文檔集子結(jié)點,,將其句柄返回給應(yīng)用軟件。
3.A軟件發(fā)出指令,在文檔集hDocBase中新建文檔,將其句柄存放在hDochDoc=InsertNewObj(hDocSet,0,UOI_Obj::TYPE_DOC);文檔庫系統(tǒng)執(zhí)行該指令,在hDocBase對應(yīng)的結(jié)點下添加一個文檔結(jié)點,將其句柄返回給應(yīng)用軟件。
4.A軟件發(fā)出指令,在文檔hDoc中新建一頁,版心大小是寬w,高h(yuǎn),將其句柄存放在hPage
UOI_Page page;page.size.w=w;page.size.h=h;UOI_Insert(hDoc,0,&page,&hPage);文檔庫系統(tǒng)執(zhí)行該指令,在hDoc對應(yīng)的結(jié)點下添加一個頁結(jié)點,其版心屬性按寬w高h(yuǎn)設(shè)置,將其句柄返回給應(yīng)用軟件。
5.A軟件發(fā)出指令,在頁hPage中創(chuàng)建一層,將其句柄存放在hLayerhLayer=InertNewObj(hPage,0,UOI_Obj::TYPE_LAYER);文檔庫系統(tǒng)執(zhí)行該指令,在hPage對應(yīng)的結(jié)點下添加一個層結(jié)點,將其句柄返回給應(yīng)用軟件。
6.A軟件發(fā)出指令,設(shè)置字號為sUOI_CharSize charSize;charSize.m Width=charSize.m_Height=s;UOI_Insert(hLayer,0,&charSize);文檔庫系統(tǒng)執(zhí)行該指令,在hLayer對應(yīng)的結(jié)點下添加一個字號結(jié)點,其寬高屬性都設(shè)置為s,將其句柄返回給應(yīng)用軟件。
7.A軟件發(fā)出指令,在坐標(biāo)(x1,y1)位置插入文字串“書生意氣揮斥方遒”UOI_Text text;text.m_pText=Duplicate(“書生意氣揮斥方遒”);text.m_Encoding=UOI_Text::ENCODE_GB13000;text.m_Start.x=x1;//起點坐標(biāo)的X坐標(biāo)text.m_Start.y=y(tǒng)1;//起點坐標(biāo)的Y坐標(biāo)UOI_Insert(hLayer,1,&text);文檔庫系統(tǒng)執(zhí)行該指令,在hLayer對應(yīng)的結(jié)點下再添加一個文字子結(jié)點,其文字?jǐn)?shù)據(jù)為“書生意氣揮斥方遒”,其字符編碼方式為GB13000,文字起點為(x1,y1),并將其句柄返回給應(yīng)用軟件。
8.A軟件發(fā)出指令,關(guān)閉文檔庫hDocBaseUOI_Close(NULL,hDocBase);
文檔庫系統(tǒng)執(zhí)行該指令,關(guān)閉文件c:\sample\mydocbase.sep。
9.B軟件發(fā)出指令,打開文檔庫c:\sample\mydocbase.sep,將其句柄存放在hDocBaseUOI_Open(“c:\\sample\\mydocbase.sep”,F(xiàn)ALSE,&hDocBase);文檔庫系統(tǒng)執(zhí)行該指令,打開文件c:\sample\mydocbase.sep。
10.B軟件發(fā)出指令,獲取文檔庫hDocBase第一個文檔集的指針,將其句柄存放在hDocSetUOI_GetHandle(hDocBase,0,&hDocSet);文檔庫系統(tǒng)執(zhí)行該指令,尋找根結(jié)點下第一個類型為文檔集的子結(jié)點,將其句柄返回給應(yīng)用軟件。
11.B軟件發(fā)出指令,獲取文檔集hDocSet第一個文檔的指針,將其句柄存放在hDocUOI_GetHandle(hDocSet,0,&hDoc);文檔庫系統(tǒng)執(zhí)行該指令,尋找hDocSet對應(yīng)的結(jié)點下第一個類型為文檔的子結(jié)點,將其句柄返回給應(yīng)用軟件。
12.B軟件發(fā)出指令,獲取文檔hDoc第一頁的指針,將其句柄存放在hPageUOI_GetHandle(hDoc,0,&hPage);文檔庫系統(tǒng)執(zhí)行該指令,尋找hDoc對應(yīng)的結(jié)點下第一個類型為頁的子結(jié)點,將其句柄返回給應(yīng)用軟件。
13.B軟件獲取該頁版面位圖,用于顯示該頁UOI_GetPageBmp(hPage,rect,but);文檔庫系統(tǒng)執(zhí)行該指令,按照前述方法(文檔庫系統(tǒng)實施例說明第9條)生成hPage對應(yīng)的頁的版面位圖,將其返回給應(yīng)用軟件。
14.B軟件發(fā)出指令,獲取hPage第一層的指針,將其句柄存放在hLayerUOI_GetHandle(hPage,0,&hLayer);文檔庫系統(tǒng)執(zhí)行該指令,尋找hPage對應(yīng)的結(jié)點下第一個類型為層的子結(jié)點,將其句柄返回給應(yīng)用軟件。
15.B軟件發(fā)出指令,獲取第一個版面對象的句柄hObj
UOI_GetHandle(hLayer,0,&hObj);文檔庫系統(tǒng)執(zhí)行該指令,尋找hDocSet對應(yīng)的結(jié)點下第一個子結(jié)點,將其句柄返回給應(yīng)用軟件。
16.B軟件發(fā)出指令,獲取hObj的類型UOI_GetObjType(hObj,&type);文檔庫系統(tǒng)執(zhí)行該指令,獲取hObj對應(yīng)的結(jié)點的類型,將其返回給應(yīng)用軟件。
17.B軟件發(fā)現(xiàn)這是一個字號對象,獲取該對象UOI_GetObj(hObj,&charSize);文檔庫系統(tǒng)執(zhí)行該指令,獲取hObj對應(yīng)的結(jié)點的數(shù)據(jù),將其返回給應(yīng)用軟件。
18.B軟件將字高放大一倍charSize.m_Height*=2;UOI_SetObj(hObj,&charSize);文檔庫系統(tǒng)執(zhí)行該指令,設(shè)置hObj對應(yīng)的結(jié)點的屬性。
19.B軟件重新獲取版面位圖并顯示,這時會發(fā)現(xiàn)屏幕上的“書生意氣揮斥方遒”變成長體字了。
下面,參照圖18描述依照本發(fā)明的文檔操作系統(tǒng)執(zhí)行一操作的一個例子。在該例子中,應(yīng)用軟件通過統(tǒng)一的接口標(biāo)準(zhǔn)(UOML接口)請求對文檔的操作。文檔庫系統(tǒng)可能會有不同廠商的不同型號,但是對于應(yīng)用開發(fā)廠商來說面向的都是同一個接口標(biāo)準(zhǔn),因此都可以與之配套使用。
在本發(fā)明中,不同的應(yīng)用軟件可以同時或不同時調(diào)用同一個文檔庫系統(tǒng),同一應(yīng)用軟件可以同時或不同時調(diào)用不同的文檔庫系統(tǒng)。
依照本發(fā)明,使得應(yīng)用層和數(shù)據(jù)處理層分離,使得同一文檔能在不同的應(yīng)用軟件之間通用,使不同應(yīng)用軟件之間具有良好的文檔互操作性。
依照本發(fā)明,形成產(chǎn)業(yè)分工,減少重復(fù)開發(fā),并更加專業(yè)、完備、正確;對文檔的基本操作都在文檔庫系統(tǒng)中處理,各應(yīng)用軟件不必重復(fù)開發(fā)。而且由于文檔庫系統(tǒng)是由專業(yè)廠商開發(fā),相關(guān)技術(shù)的專業(yè)性、完備性、正確性較有保障,而且應(yīng)用軟件廠商和用戶可以選擇做的最好的一家文檔庫系統(tǒng)廠商,從而保證處理效果的正確性和一致性。
依照本發(fā)明,提供多文檔甚至海量文檔的管理機(jī)制,使文檔之間能夠有效組織起來,便于檢索、查詢、保管,便于嵌入較強(qiáng)的信息安全機(jī)制。
依照本發(fā)明,提供更好的安全機(jī)制,可以設(shè)置多種角色,細(xì)粒度地設(shè)置每個角色的權(quán)限。其中細(xì)粒度是雙重的,一方面可以對整個文檔或文檔的一個細(xì)微之處進(jìn)行權(quán)限設(shè)置,另一方面可以設(shè)置種類非常多的權(quán)限,而不僅僅是傳統(tǒng)的讀/寫/不可訪問三級。
依照本發(fā)明,鼓勵創(chuàng)新,合理競爭。形成合理的產(chǎn)業(yè)分工后,各文檔庫系統(tǒng)廠商和各應(yīng)用軟件廠商就會在領(lǐng)域展開競爭,而不會再出現(xiàn)MicrosoftWord一樣靠文檔格式來壟斷應(yīng)用軟件的情形發(fā)生。各文檔庫系統(tǒng)廠商也可以在標(biāo)準(zhǔn)之外增加新的功能以吸引用戶,標(biāo)準(zhǔn)并不會對創(chuàng)新形成束縛。
依照本發(fā)明,便于優(yōu)化性能,有更好的可移植性和可伸縮性。無論是什么平臺,什么樣的性能,都可以遵循同樣的調(diào)用接口,使得在不改變接口標(biāo)準(zhǔn)的情況下可以不斷優(yōu)化性能,并移植到不同的平臺。
權(quán)利要求
1.一種文檔處理系統(tǒng),其包括文檔庫系統(tǒng)、存儲器、應(yīng)用軟件,其中,文檔庫的數(shù)據(jù)存儲在存儲器中,文檔庫系統(tǒng)和應(yīng)用軟件通過一種標(biāo)準(zhǔn)調(diào)用接口連接起來,該標(biāo)準(zhǔn)調(diào)用接口采用與平臺無關(guān)的描述方式進(jìn)行描述,應(yīng)用軟件對文檔的操作都統(tǒng)一成對一種預(yù)定義的通用文檔模型進(jìn)行的操作,并通過該標(biāo)準(zhǔn)調(diào)用接口向文檔庫系統(tǒng)發(fā)出指令,文檔庫系統(tǒng)按照應(yīng)用軟件的指令,對存儲在存儲器中的文檔庫執(zhí)行相應(yīng)的操作。
2.如權(quán)利要求1所述的文檔操作系統(tǒng),其中,所述描述方式為XML。
3.如權(quán)利要求2所述的文檔操作系統(tǒng),其中,數(shù)值由字符串表示。
4.如權(quán)利要求2所述的文檔操作系統(tǒng),其中,該標(biāo)準(zhǔn)調(diào)用接口中的功能調(diào)用和調(diào)用返回結(jié)果采用schema約束。
5.如權(quán)利要求2所述的文檔操作系統(tǒng),其中,接口標(biāo)準(zhǔn)中的功能調(diào)用和調(diào)用返回結(jié)果采用DTD約束。
6.如權(quán)利要求2所述的文檔操作系統(tǒng),其中,動作采用XML元素進(jìn)行描述,對象由子元素和屬性進(jìn)行描述。
7.如權(quán)利要求1所述的文檔操作系統(tǒng),其中,接口標(biāo)準(zhǔn)采用腳本進(jìn)行描述。
8.一種文檔處理方法,包括以下步驟應(yīng)用軟件通過標(biāo)準(zhǔn)調(diào)用接口向文檔庫系統(tǒng)發(fā)出指令,其對文檔的操作都統(tǒng)一成對一種預(yù)定義的通用文檔模型進(jìn)行的操作;文檔庫系統(tǒng)按照應(yīng)用軟件的指令,對存儲在存儲器中的文檔庫執(zhí)行相應(yīng)的操作,其中,文檔庫系統(tǒng)和應(yīng)用軟件通過上述標(biāo)準(zhǔn)調(diào)用接口連接起來,該標(biāo)準(zhǔn)調(diào)用接口采用與平臺無關(guān)的描述方式進(jìn)行描述。
9.如權(quán)利要求8所述的文檔操作系統(tǒng),其中,所述描述方式為XML。
10.如權(quán)利要求9所述的文檔操作系統(tǒng),其中,數(shù)值由字符串表示。
11.如權(quán)利要求9所述的文檔操作系統(tǒng),其中,該標(biāo)準(zhǔn)調(diào)用接口中的功能調(diào)用和調(diào)用返回結(jié)果采用schema約束。
12.如權(quán)利要求9所述的文檔操作系統(tǒng),其中,接口標(biāo)準(zhǔn)中的功能調(diào)用和調(diào)用返回結(jié)果采用DTD約束。
13.如權(quán)利要求9所述的文檔操作系統(tǒng),其中,動作采用XML元素進(jìn)行描述,對象由子元素和屬性進(jìn)行描述。
14.如權(quán)利要求8所述的文檔操作系統(tǒng),其中,接口標(biāo)準(zhǔn)采用腳本進(jìn)行描述。
全文摘要
本發(fā)明提供一種文檔處理系統(tǒng)和文檔處理方法。其中該文檔處理系統(tǒng)包括文檔庫系統(tǒng)、存儲器、應(yīng)用軟件,其中,文檔庫的數(shù)據(jù)存儲在存儲器中,文檔庫系統(tǒng)和應(yīng)用軟件通過一種標(biāo)準(zhǔn)調(diào)用接口連接起來,該標(biāo)準(zhǔn)調(diào)用接口采用與平臺無關(guān)的描述方式進(jìn)行描述。應(yīng)用軟件對文檔的操作都統(tǒng)一成對一種預(yù)定義的通用文檔模型進(jìn)行的操作,并通過該標(biāo)準(zhǔn)調(diào)用接口向文檔庫系統(tǒng)發(fā)出指令,文檔庫系統(tǒng)按照應(yīng)用軟件的指令,對存儲在存儲器中的文檔庫執(zhí)行相應(yīng)的操作。
文檔編號G06F1/00GK1979479SQ20051013107
公開日2007年6月13日 申請日期2005年12月9日 優(yōu)先權(quán)日2005年12月9日
發(fā)明者王東臨, 郭旭, 劉昌偉 申請人:北京書生國際信息技術(shù)有限公司