1、 電子書介紹css
轉載請註明http://www.cnblogs.com/xckk/p/6020324.html html
Epub(Electronic Publication)是一個徹底開放和免費的電子書標準。是一個自由的開放標java
準,屬於一種能夠「自動從新編排」的內容。瀏覽器
「自動從新編排」的緣由是內部使用XHTML來展示文件的內容,用一系列CSS來定義格式和版面設計,達到了內容和編排的分離。安全
如今EpubEpub包括三項主要規格:dom
開放出版結構(Open Publication Structure,OPS)2.0,以定義內容的版面;ide
開放包裹格式(Open Packaging Format,OPF)2.0,定義以XML爲基礎的.epub檔案結構;模塊化
開放容器格式(OEBPS Container Format,OCF)3.0,將全部相關文件收集至ZIP壓縮檔案之中。工具
OPS規範的目的是爲內容提供者(例如出版商、做者等)和出版工具提供者提供一個最小的通用指導,以保證電子內容可以在各類閱讀系統中保持一致性。ui
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
2、 EPUB基礎知識介紹
打開方式
epub能夠用stanza的PC版打開,也能夠用Firefox、Chrome上的相應的插件。
Firefox EpubReader 擴充組件:EPUBReader是一個能夠閱讀ePub格式文件的Firefox擴充程序。你無須安裝額外的軟件,在Firefox瀏覽器中即可閱讀ePub格式文件,推薦這個。
文件解析
一個 EPUB 就是一個簡單 ZIP 格式文件(使用 .epub 擴展名),其中包括按照預先定義的方式排列的文件。除此之外,EPUB 很是簡單。只需將後綴改成.zip或.rar,解壓便可看到裏面的文件內容。以下圖
一個epub電子書的zip大體包含如下東西:
一、mimetype 文件,必須是壓縮包的第一個文件。注意,mimetype必須是非壓縮格式。
二、META-INF目錄,裏面至少包含一個container.xml 文件。
三、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文件。
一、.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 匹配。
二、.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 使用嵌套的導航點表示層次結構的文檔
三、.opf的spine和.ncx文件有什麼不一樣?
Spine標籤描述文檔順序,.ncx文件描述目錄。
二者很容易混淆,由於兩個文件都描述了文檔的順序和內容。要說明二者的區別,最簡單的辦法就是拿印刷書來打比方:.opf文件的spine標籤描述了書中的各個章節是如何實際鏈接起來的,比方說翻過第一章的最後一頁就看到第二章的第一頁。.ncx在圖書的一開始描述了目錄,目錄確定會包含書中主要的章節,可是還可能包含沒有單獨分頁的小節。
一條法則是ncx包含的 navPoint 元素一般比 opf spine中的itemref 元素多。實際上,spine 中的全部項都會出如今 .ncx 中,但.ncx可能更詳細。
3、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 |
特定分辨率圖片存放目錄 目前分辨率有12八、17六、240、320、360、480、600(600沒有單獨的目錄,由於600及600以上寬度的圖片,只須要在orig中存在) |
目錄 |
可選 |
Image0.jpg |
圖片文件 Orig存放的是原圖,若是章節引用了圖片,則該目錄確定有圖片;128-480目錄,若是原圖寬度大於目錄名稱值的,纔會有文件,如圖片寬度爲300,則在orig、12八、17六、240中會有對應壓縮後的圖片文件。 |
jpg/png |
可選 |
4、 JAVA解析epub格式電子書示例
文章最後提供一下解析epub電子書的示例程序。程序的主要功能是讀取修改.epub格式文件的
相關材料和源碼均在連接中能夠下載:http://pan.baidu.com/s/1bnm8YXT
包括
一、JAVA項目工程test_epub,裏面包括了jar包和一本epub電子書myBook.epub
二、epub相關jar包(epublib-codr-lastest.jar、以及slf4j-*.jar)
三、電子書myBook.epub
JAVA解析.epub格式電子書,具體實現代碼以下。寫了一個簡單helloWorld程序,加入了相應的jar包。
程序說明:
一、讀取epub/myBook.epub文件。
二、修改metaData中的title
三、輸出新的.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 epub EpubWriter 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
秀才坤坤出品