第四章、epub文件处理 -- epub文件内部组成
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
第四章、epub文件處理?--?epub文件內(nèi)部組成
第三章的結(jié)尾,我們說到從FBReaderApp類的openBookInternal方法,就要開始對(duì)epub文件的處理流程了。
在對(duì)這個(gè)流程進(jìn)行詳細(xì)的分析之前,我們有必要先用一個(gè)章節(jié)詳細(xì)介紹一下epub文件的內(nèi)部組成。
首先,epub文件一種壓縮文件,是壓縮格式是與zip壓縮文件是一樣的。換一句話說,epub文件是可以用支持zip格式的解壓縮文件解壓的(有些軟件不能識(shí)別epub后綴名,需要手動(dòng)把.epub的后綴名改成.zip)。
把epub文件解壓之后,打開文件夾,我們可以看到有如下的文件與文件夾,我們一個(gè)一個(gè)來看一下。
META-INF文件夾
這個(gè)文件文件夾的名字翻譯成中文就是“元信息”。文件夾里面只有一個(gè)container.xml文件
container.xml文件
文件的內(nèi)容如下:
這段內(nèi)容的作用就是標(biāo)明了.opf文件的位置。這個(gè).opf文件是一個(gè)很重要的文件,它記錄了epub文件內(nèi)部各個(gè)文件的具體信息,我們會(huì)在介紹OPS文件夾的時(shí)候詳細(xì)介紹這個(gè)文件。
程序必須正確解析.opf文件的內(nèi)容后才能正常運(yùn)行,但是.opf這個(gè)文件的文件名本身卻是可以自定義的,也就是說,不同的epub文件里面可能包含不同名字、位于不同行位置的.opf文件。那么,如何確保程序能夠正確找到并解析.opf文件呢,就是通過container.xml這個(gè)文件來指定.opf文件。正是基于這個(gè)原因,epub文件的標(biāo)準(zhǔn)里規(guī)定“EPUB?根目錄下必須包含?META-INF?目錄,而且其中必須要有一個(gè)文件?container.xml”(引用自http://blog.sina.com.cn/s/blog_6441e0640100gmhv.html)。
大家可以試一下,如果你把解壓后的epub文件里的container.xml文件改名后再重新壓縮成epub文件,程序就會(huì)報(bào)錯(cuò)。
OPS文件夾
OPS文件夾主要包含三種重要的文件.opf文件、ncx文件、.xhtml文件。同時(shí),還可能會(huì)有css文件和圖片文件。下面詳細(xì)介紹下這些文件。
.opf文件
opf代表“Open?Packaging?Format”,意譯成中文差不多應(yīng)該是“EPUB文件包格式”。我們說過epub文件是個(gè)zip壓縮文件,opf文件的作用可以被理解為描述了EPUB文件解壓后,內(nèi)部各個(gè)文件和文件夾的名字、位置等信息。
.opf文件主要包含三個(gè)主要的節(jié)點(diǎn)metadata、manifest、spine,這個(gè)三個(gè)節(jié)點(diǎn)分別描述了不同信息。
其中,metadata節(jié)點(diǎn)定義了epub的作者、書名、語言等元信息。這些元信息大部分都在dc的命名空間下。dc代表Dublin?Core,意指國(guó)際組織“Dublin?Core?Metadata?Initiative”定義的標(biāo)準(zhǔn)。
manifest節(jié)點(diǎn)的作用是描述epub文件內(nèi)部對(duì)應(yīng)不同章節(jié)對(duì)應(yīng)的文件的位置。manifest節(jié)點(diǎn)在這里的作用有點(diǎn)像之前提到的container.xml文件:container定義了.opf文件的位置,而manifest節(jié)點(diǎn)中的item子節(jié)點(diǎn)的href屬性則定義了含有對(duì)應(yīng)每個(gè)章節(jié)的文件的位置。
spine節(jié)點(diǎn)的作用是定義讀者在順序閱讀時(shí),每個(gè)章節(jié)出現(xiàn)的先后次序。linear這個(gè)節(jié)點(diǎn)的作用是這樣的:“?EPUB?規(guī)范的閱讀系統(tǒng)將首先打開?spine?中沒有設(shè)置為?linear=no?中的第一項(xiàng)”。所以,“建議將封面定義為?linear=no”。(引用自http://blog.sina.com.cn/s/blog_6441e0640100gmi8.html)?
????我們可以看到,我們的測(cè)試epub文件似乎并沒有嚴(yán)格按照epub規(guī)范將封面的linear屬性設(shè)置為“no”。正因?yàn)槿绱?#xff0c;第一次打開測(cè)試文件的時(shí)候,默認(rèn)的第一頁(yè)是封面而不是正文。
.ncx文件
ncx代表“Navigation?Center?eXtended”,意思大致就是導(dǎo)航文件,這個(gè)文件與目錄有直接的關(guān)系。
.ncx文件中最主要的節(jié)點(diǎn)是navMap。navMap節(jié)點(diǎn)是由許多navPoint節(jié)點(diǎn)組成的。而navPoint節(jié)點(diǎn)則是由navLabel、content兩個(gè)子節(jié)點(diǎn)組成。
navPoint節(jié)點(diǎn)中,playOrder屬性定義當(dāng)前項(xiàng)在目錄中顯示的次序。
navLabel子節(jié)點(diǎn)中的text節(jié)點(diǎn)定義了每個(gè)目錄的名字。
content子節(jié)點(diǎn)的src屬性定義了對(duì)應(yīng)每個(gè)章節(jié)的文件的具體位置。
看到這里,可能會(huì)有有人覺得.opf文件與.ncx文件有一點(diǎn)重復(fù):.opf文件的item節(jié)點(diǎn)中的href屬性描述了各個(gè)章節(jié)文件的位置與順序,.ncx文件中的conten節(jié)點(diǎn)中的src屬性也描述了各個(gè)章節(jié)文件的位置與順序。其實(shí)他們還是有區(qū)別的,區(qū)別就在于,.opf文件定義的是讀者在順序閱讀時(shí)會(huì)用到的章節(jié)文件與它們的順序,.ncx文件則定義的是目錄中會(huì)用到的章節(jié)文件與它們的順序。如果存在某些附件性質(zhì)的內(nèi)容被希望在目錄中出現(xiàn),但卻不希望在讀者順序閱讀的時(shí)候出現(xiàn)時(shí),那么就可以通過對(duì).opf文件和.ncx文件進(jìn)行不同的設(shè)置來達(dá)到這個(gè)目的。當(dāng)然,大部分的時(shí)候,.opf與.ncx這兩個(gè)文件的內(nèi)容基本是重合的。
.xhtml文件
.xhtm文件就是存儲(chǔ)每個(gè)章節(jié)具體內(nèi)容。按照epub的規(guī)范,存儲(chǔ)具體內(nèi)容的文件應(yīng)該是xhtml為后綴名(參照http://zh.wikipedia.org/wiki/EPUB),但是似乎并不是每個(gè)epub里面都用xhtml作為存儲(chǔ)具體內(nèi)容的文件的后綴名。比如,我們的測(cè)試文件就使用了html作為后綴名,我還看到過htm作為后綴名的。但其實(shí)不管用什么作為后綴名都不會(huì)有問題,因?yàn)樵?opf和.ncx文件已經(jīng)準(zhǔn)確定義文件的位置和后綴名。同時(shí),不管epub文件使用了什么后綴名,FBReader程序都是使用XHTMLReader類來處理這些文件。
樣式文件
樣式文件的作用是定義一些文本信息顯示的格式。并不是每一個(gè)epub文件內(nèi)部都會(huì)附有樣式文件,沒有樣式文件的情況下,就會(huì)使用程序默認(rèn)的樣式文件。
在FBReader程序1.0的版本里面并沒有專門讀取epub文件內(nèi)部樣式文件的類。1.0的版本直接使用了/asstes/default/style.xml作為默認(rèn)的樣式文件。不管是epub文件是否附有自帶的樣式文件文件,1.0的版本都使用的是這一套樣式文件的格式。2.0的版本增加了讀取自定義樣式文件文件的功能。大家可以在1.0版本和2.0版本下分別打開Quiet這本書(這個(gè)文件只作為測(cè)試用,請(qǐng)支持正版,多看中譯版購(gòu)買地址),就可以明顯看到樣式文件格式的不同。
1.0版本中的css解析類:ZLTextStyleCollection類
2.0的版本中的樣式文件解析類:
1.0版本顯示效果:
2.0版本顯示效果(標(biāo)題與小字部分都使用epub文件內(nèi)置的樣式文件)
圖片文件
圖片文件一般集中存儲(chǔ)在一個(gè)文件夾里面。最常見的圖片的文件就是封面圖片。封面圖片的位置會(huì)在.opf文件標(biāo)明。
Mimetype文件
這個(gè)文件的內(nèi)容很簡(jiǎn)單,只有一行:application/epub+zip。其實(shí)這行內(nèi)容就是表明了epub文件的mimetype屬性。搞過網(wǎng)頁(yè)的朋友應(yīng)該挺熟悉這個(gè)mimetype屬性的,html文件的mimetype屬性就是text/html,樣式文件文件的mimetype屬性是text/樣式文件,js文件的mimtype屬性則是application/javascript。
根據(jù)epub的標(biāo)準(zhǔn),epub根目錄下必須包含mimetype文件,文件名與內(nèi)容都不能變。不過,我仔細(xì)看了下FBReader代碼,并沒有發(fā)現(xiàn)專門針對(duì)這個(gè)文件的部分。我有試著把這個(gè)miemtype文件刪掉然后再重新壓縮成epub文件。FBReader程序還是能正常打開這個(gè)文件。總而言之,按照標(biāo)準(zhǔn),mimetype文件必須有,而且文件名與內(nèi)容都不能變。不過,實(shí)際操作起來,沒有mimetype文件,FBReader一樣能正常打開epub文件。
如果大家想更深入得了解epub文件的組成,可以參考下這個(gè)博客的相關(guān)內(nèi)容。
http://blog.sina.com.cn/s/blog_6441e0640100gmfe.html
http://blog.sina.com.cn/s/blog_6441e0640100gmhv.html
http://blog.sina.com.cn/s/blog_6441e0640100gmi8.html
http://blog.sina.com.cn/s/blog_6441e0640100gmj9.html
轉(zhuǎn)載于:https://my.oschina.net/u/938986/blog/335833
總結(jié)
以上是生活随笔為你收集整理的第四章、epub文件处理 -- epub文件内部组成的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第七周项目4-计算一个程序猿的周工资
- 下一篇: Binary String Matchi