標籤:toc avl 2.0 head output 文章 hello slf4j url
一、 電子書介紹
轉載請註明http://www.cnblogs.com/xckk/p/6020324.html
Epub(Electronic Publication)是一個完全開放和免費的電子書標準。是一個自由的開放標
准,屬於一種可以“自動重新編排”的內容。
“自動重新編排”的原因是內部使用XHTML來展現檔案的內容,用一系列CSS來定義格式和版面設計,達到了內容和編排的分離。
現在EpubEpub包括三項主要規格:
開放出版結構(Open Publication Structure,OPS)2.0,以定義內容的版面;
開放包裹格式(Open Packaging Format,OPF)2.0,定義以XML為基礎的.epub檔案結構;
開放容器格式(OEBPS Container Format,OCF)3.0,將所有相關檔案收集至ZIP壓縮檔案之中。
OPS規範的目的是為內容提供者(例如出版商、作者等)和出版工具提供者提供一個最小的通用指導,以保證電子內容能夠在各種閱讀系統中保持一致性。
OPS用XHTML來構築書的內容,用CSS來定義書的格式和版面設計等
OPF規範則定義了將各種OPS出版元件連線在一起的機制,並為其提供附加的結構和語言。OPF規範與OPS規範是分開的,目的是將內容描述技術和封裝描述技術模組化。
OCF定義了將所有電子出版組件封裝成一個單一檔案進行傳播、遞送和存檔的標準機制。是一種打包機制。
相關規範文檔:
OPS2.0規範:http://www.idpf.org/epub/20/spec/OPS_2.0.1_draft.htm
OPF2.0規範:http://www.idpf.org/epub/20/spec/OPF_2.0.1_draft.htm
OCF規範:http://www.idpf.org/epub/301/spec/epub-ocf.html
二、 EPUB基礎知識介紹
開啟檔案
epub可以用stanza的PC版開啟,也可以用Firefox、Chrome上的相應的外掛程式。
Firefox EpubReader 擴充組件:EPUBReader是一個可以閱讀ePub格式檔案的Firefox擴充程式。你無須安裝額外的軟體,在Firefox瀏覽器中便可閱讀ePub格式檔案,推薦這個。
檔案解析
一個 EPUB 就是一個簡單 ZIP 格式檔案(使用 .epub 副檔名),其中包括按照預先定義的方式排列的檔案。除此以外,EPUB 非常簡單。只需將尾碼改為.zip或.rar,解壓即可看到裡面的檔案內容。如
一個epub電子書的zip大致包含以下東西:
1、mimetype 檔案,必須是壓縮包的第一個檔案。注意,mimetype必須是非壓縮格式。
2、META-INF目錄,裡面至少包含一個container.xml 檔案。
3、OEBPS目錄(可以是別的名字,但建議用這個名字),包含了:
a) image子目錄(不一定總有)存放了所有的圖片檔案
b) content.opf 檔案名稱可以是其它的,副檔名一定是opf,就是一個xml格式的包內的檔案清單
c) toc.ncx 目錄檔案,一個“邏輯目錄”, 瀏覽控制檔案.
d) 一些xhtml或html檔案。就是書的內容。
簡單 EPUB 檔案的目錄和檔案結構:
mimetype
META-INF/
container.xml
OEBPS/
content.opf
title.html
content.html
stylesheet.css
toc.ncx
images/
cover.png
一個完整的epub格式電子書,OPF檔案一般包括OEBPS目錄下的 .opf和 .ncx檔案。
1、.opf檔案
包括四個元素:metadata, manifest, spine, guide
(1)metadata: epub的中繼資料,如title、language、identifier、cover等。其中,title 和 identifier這兩個資料是必須的。按照EPUB規範,identifier由數字圖書的建立者定義,必須唯一。對於圖書出版商來說,這個欄位一般包括ISBN或者Library of Congress編號;也可以使用URL或者隨機產生的唯一使用者ID。注意:unique-identifier 的值必須和 dc:identifier 元素的 ID 屬性匹配。
(2)manifest:列出了目錄中所包含的所有檔案(xhtml、css、png、ncx等)。EPUB 鼓勵使用 CSS 設定圖書內容的樣式,因此 manifest標籤下也包含 CSS檔案。注意:進入數字圖書的所有檔案都必須在 manifest 中列出,manifest只列出檔案,未列出檔案之間的結構順序。
3)spine:所有xhtml文檔的線性讀取順序。其中,spine標籤的toc屬性必須包含在manifest列出來的.ncx的id。可以將 OPF spine 理解為是書中 “頁面” 的順序,解析的時候按照文檔順序從上到下依次讀取 spine。
在spine中的每個 itemref 元素都需要有一個 idref 屬性,這個屬性和 manifest 中的某個 ID 匹配。
2、.ncx檔案
ncx 定義了數字圖書的目錄表。複雜的圖書中,目錄表通常採用階層,包括嵌套的內容、章和節。包含了toc(tablet of content,提供了分段的一些資訊)。ncx的 <head> 標記中包含四個 meta 元素:
uid:數字圖書的惟一ID。該元素和 OPF 檔案中的 dc:identifier 對應。
depth:反映目錄表中層次的深度。
totalPageCount 和 maxPageNumber:僅用於紙質圖書,保留 0 即可。
docTitle/text 的內容是圖書的標題,和 OPF 中的 dc:title 匹配。後面的樣本程式是對該標題變更。
navMap定義了圖書的目錄,是 ncx 檔案中最重要的部分。navMap 包含一個或多個 navPoint 元素,每個 navPoint 都要包含下列元素:
playOrder:說明文檔的讀取順序。和 OPF spine 中 itemref 元素的順序相同。
navLabel/text :給出該章節的標題。通常是章的標題或者數字。
content :它的 src 屬性指向包含這些內容的實體資源。就是 OPF manifest 中聲明的檔案。
還可以有一個或多個 navPoint 元素。ncx 使用嵌套的導航點展示層次結構的文檔
3、.opf的spine和.ncx檔案有什麼不同?
Spine標籤描述文檔順序,.ncx檔案描述目錄。
兩者很容易混淆,因為兩個檔案都描述了文檔的順序和內容。要說明兩者的區別,最簡單的辦法就是拿印刷書來打比方:.opf檔案的spine標籤描述了書中的各個章節是如何實際串連起來的,比方說翻過第一章的最後一頁就看到第二章的第一頁。.ncx在圖書的一開始描述了目錄,目錄肯定會包含書中主要的章節,但是還可能包含沒有單獨分頁的小節。
一條法則是ncx包含的 navPoint 元素通常比 opf spine中的itemref 元素多。實際上,spine 中的所有項都會出現在 .ncx 中,但.ncx可能更詳細。
三、ocf格式電子書介紹
咪咕閱讀製作的電子書是.ocf格式,與EPUB所規定的大部分格式與展現標準相同,並且對其進行擴充,重點解決了版面豐富性、格式開放性和文檔安全性、可交換性、可擴充性、可裁剪性。適用於手機、手持閱讀終端等裝置。
ocf格式的圖書經過內部的圖書入庫、章節拆分與壓縮、加密以及MEB打包後,形成.meb作為副檔名的電子書,就可以上架供用戶端解析閱讀了。
OCF包的目錄結構:
OCF│ mimetype├─META-INF│ │ book.ncx│ │ book.opf│ │ container.xml│ │ cover.xml│ │ right.xml│ └─ext│ cover180240.jpg│ cover5168.png│ cover600800.jpg│ cover6080.jpg│ cover75100.jpg│ cover81108.png│ cover90120.jpg └─oebps├─chapter01│ │ chapter01.html │ ├─css│ │ style.css │ └─images│ ├─128│ │ Image0.jpg │ ├─176│ │ Image0.jpg │ ├─240│ │ Image0.jpg │ ├─320│ │ Image0.jpg │ ├─360│ │ Image0.jpg │ ├─480│ │ Image0.jpg │ └─orig│ Image0.jpg ├─chapter02│ │ chapter02.html │ ├─css│ │ style.css │ └─images│ ├─128│ │ Image0.jpg │ │ Image1.jpg │ ├─176│ │ Image0.jpg│ │ Image1.jpg│ ├─240│ │ Image0.jpg│ │ Image1.jpg│ ├─320│ │ Image0.jpg│ ├─360│ │ Image0.jpg│ ├─480│ │ Image0.jpg │ └─orig│ Image0.jpg│ Image1.jpg
檔案名稱與目錄名的描述如下:
檔案名稱/目錄名 |
描述 |
類型 |
限定 |
mimetype |
Mime類型描述檔案 |
Ascii檔案 |
必選 |
META-INF/ |
Meta資訊目錄 |
目錄 |
必選 |
container.xml |
容器描述檔案 |
Xml檔案 |
必選 |
book.opf |
圖書中繼資料描述檔案,如書名、作者資訊 |
Xml檔案 |
必選 |
book.ncx |
描述圖書的目錄結構資訊 |
Xml檔案 |
必選 |
cover.xml |
封面內容檔案 |
Xml檔案 |
必選 |
right.xml |
權利描述檔案 |
Xml檔案 |
可選 |
ext/ |
MEB檔案擴充目錄 |
目錄 |
可選 |
coverWH.jpg coverWH.png |
封面圖片 |
jpg/png檔案 |
可選 |
oebps/ |
MEB內容資訊目錄 |
目錄 |
必選 |
chapterXX/ |
章節目錄 |
目錄 |
必選 |
chapterXX.html |
頁內容頁面 |
xHtml檔案 |
/ |
images/ |
圖片目錄 |
目錄 |
可選 |
orig |
原圖存放目錄 |
目錄 |
可選 |
128 |
特定解析度圖片存放目錄 目前解析度有128、176、240、320、360、480、600(600沒有單獨的目錄,因為600及600以上寬度的圖片,只需要在orig中存在) |
目錄 |
可選 |
Image0.jpg |
圖片檔案 Orig存放的是原圖,如果章節引用了圖片,則該目錄肯定有圖片;128-480目錄,如果原圖寬度大於目錄名稱值的,才會有檔案,片寬度為300,則在orig、128、176、240中會有對應壓縮後的圖片檔案。 |
jpg/png |
可選 |
四、 JAVA解析epub格式電子書樣本
文章最後提供一下解析epub電子書的樣本程式。程式的主要功能是讀取修改.epub格式檔案的
相關材料和源碼均在連結中可以下載:http://pan.baidu.com/s/1bnm8YXT
包括
1、JAVA項目工程test_epub,裡麵包括了jar包和一本epub電子書myBook.epub
2、epub相關jar包(epublib-codr-lastest.jar、以及slf4j-*.jar)
3、電子書myBook.epub
JAVA解析.epub格式電子書,具體實現代碼如下。寫了一個簡單helloWorld程式,加入了相應的jar包。
程式說明:
1、讀取epub/myBook.epub檔案。
2、修改metaData中的title
3、輸出新的.epub檔案到工程目錄下。檔案名稱mynewbook.epub
通過解壓mynewbook.epub檔案,可以看到toc.ncx檔案中的<docTitle>和content.opf中的<dc:title>標籤內容都進行了修改。
package com.hk;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import nl.siegmann.epublib.domain.Book;import nl.siegmann.epublib.epub.EpubReader;import nl.siegmann.epublib.epub.EpubWriter;/*** * epub格式檔案讀和寫樣本程式* @author hk* @version [版本號碼, 2015年11月26日]* @see [相關類/方法]* @since [產品/模組版本]*/public class TestEpub{public static void main(String[] args){System.out.println("hello world");// 獲得電子書路徑String epubPath = getEbookPath();// 讀epub檔案Book book = readBook(epubPath);// 修改電子書modifyBook(book);String outputFileName = "mynewbook.epub";writeBook(book, outputFileName);}/*** 獲得電子書路徑* * @return* @see [類、類#方法、類#成員]*/private static String getEbookPath(){// 得到的currentPath = file:/E:/study/epub/test_epub/bin/,其中E:/study/epub/test_epub是工程路徑String currentPath = Thread.currentThread().getClass().getResource("/").toString();String epubPath = currentPath + "epub/myBook.epub";// 去年路徑中的首碼//file:/epubPath = epubPath.substring(6, epubPath.length());epubPath = epubPath.replace("/", "//");System.out.println(epubPath);return epubPath;}/*** 讀epub檔案* * @return* @see [類、類#方法、類#成員]*/private static Book readBook(String epubPath){EpubReader epubReader = new EpubReader();Book book = null;try{InputStream inputStr = new FileInputStream(epubPath);book = epubReader.readEpub(inputStr);}catch (FileNotFoundException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();}return book;}/*** 修改電子書 本處修改了toc.ncx檔案中的<docTitle>和content.opf中的<dc:title>標籤內容.* * @param book* @see [類、類#方法、類#成員]*/private static void modifyBook(Book book){// 設定epub檔案內title.List<String> titlesList = new ArrayList<String>();titlesList.add("test book");book.getMetadata().setTitles(titlesList);}/*** 輸出電子書* * @param book* @param fileName* @see [類、類#方法、類#成員]*/private static void writeBook(Book book, String fileName){// write epubEpubWriter epubWriter = new EpubWriter();try{OutputStream ouput = new FileOutputStream(fileName);epubWriter.write(book, ouput);}catch (FileNotFoundException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();}}}
文章參考了work hard work smart的技術部落格
http://www.cnblogs.com/linlf03/archive/2011/12/13/2286218.html
程式實現部落格http://www.cnblogs.com/xckk/p/4598196.html
秀才坤坤出品
epub、ocf等常用電子書格式淺析----附JAVA樣本程式