epub、ocf等常用電子書格式淺析----附JAVA示例程序


一、 電子書介紹

轉載請注明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版打開,也可以用FirefoxChrome上的相應的插件。

Firefox EpubReader 擴充組件:EPUBReader是一個可以閱讀ePub格式文件的Firefox擴充程序。你無須安裝額外的軟件,在Firefox瀏覽器中便可閱讀ePub格式文件,推薦這個。

文件解析

一個 EPUB 就是一個簡單 ZIP 格式文件(使用 .epub 擴展名),其中包括按照預先定義的方式排列的文件。除此以外,EPUB 非常簡單。只需將后綴改為.zip或.rar,解壓即可看到里面的文件內容。如下圖

0

一個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 屬性匹配。

1

(2)manifest:列出了目錄中所包含的所有文件(xhtml、css、png、ncx等)。EPUB 鼓勵使用 CSS 設定圖書內容的樣式,因此 manifest標簽下也包含 CSS文件。注意:進入數字圖書的所有文件都必須在 manifest 中列出,manifest只列出文件,未列出文件之間的結構順序。

 

2

3

3)spine:所有xhtml文檔的線性閱讀順序。其中,spine標簽的toc屬性必須包含在manifest列出來的.ncx的id。可以將 OPF spine 理解為是書中 “頁面” 的順序,解析的時候按照文檔順序從上到下依次讀取 spine。

在spine中的每個 itemref 元素都需要有一個 idref 屬性,這個屬性和 manifest 中的某個 ID 匹配。

4

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 使用嵌套的導航點表示層次結構的文檔

5

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 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

秀才坤坤出品


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM