天天看點

Epub電子書格式(四)

做人要厚道:http://blog.sina.com.cn/s/blog_6441e0640100gmj9.html

現在要講到epub一個重要的檔案NCX(Navigation Control file for XML applications)

内容的 NCX 表

    NCX表,在AmazonKindlePublishingGuidelinesV1.3中被稱為邏輯目錄(Logical Table Of Contents),雖然kindle的電子書不是epub格式,但NCX也是強制要求的檔案之一。

    盡管 OCF 檔案是作為 EPUB 本身的一部分定義的,但最後一個主要的中繼資料檔案參照了不同的數字圖書标準。DAISY 是一個專門為不能使用傳統書籍的讀者設計資料格式的組織,通常是因為視力受損或者不便于使用印刷的書籍。EPUB 借用了 DAISY 的 NCX DTD。NCX 定義了數字圖書的目錄表。複雜的圖書中,目錄表通常采用層次結構,包括嵌套的内容、章和節。

    使用 XML 編輯器建立 OEBPS/toc.ncx 下面給出了一個簡單的NCX檔案内容:

<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN"

                 "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">

<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">

  <head>

    <meta name="dtb:uid" content="urn:uuid:12345"/>

    <meta name="dtb:depth" content="1"/>

    <meta name="dtb:totalPageCount" content="0"/>

    <meta name="dtb:maxPageNumber" content="0"/>

  </head>

  <docTitle>

    <text>Hello World: My First EPUB</text>

  </docTitle>

  <navMap>

    <navPoint id="navpoint-1" playOrder="1">

      <navLabel>

        <text>Book cover</text>

      </navLabel>

      <content src="title.html"/>

    </navPoint>

    <navPoint id="navpoint-2" playOrder="2">

      <navLabel>

        <text>Contents</text>

      </navLabel>

      <content src="content.html"/>

    </navPoint>

  </navMap>

</ncx>

NCX 中繼資料

    DTD 要求 NCX 

<head>

 标記中包含四個 

meta

 元素:

  • uid

    : 數字圖書的惟一 ID。該元素應該和 OPF 檔案中的 

    dc:identifier

     對應。
  • depth

    :反映目錄表中層次的深度。該例隻有一層,是以是 1。
  • totalPageCount

     和 

    maxPageNumber

    :僅用于紙質圖書,保留 0 即可。

    docTitle/text

 的内容是圖書的标題,和 OPF 中的 

dc:title

 比對。

NCX navMap

    navMap

 是 NCX 檔案中最重要的部分,定義了圖書的目錄。

navMap

 包含一個或多個 

navPoint

 元素。每個 

navPoint

 都要包含下列元素:

  • playOrder

     屬性,說明文檔的閱讀順序。和 OPF spine 中 

    itemref

     元素的順序相同。
  • navLabel/text

     元素,給出該章節的标題。通常是章的标題或者數字,如 “第一章”,或者 — 像這個例子一樣 — “封面”。
  • content

     元素,它的 

    src

     屬性指向包含這些内容的實體資源。就是 OPF manifest 中聲明的檔案(也可使用片段辨別符引用 XHTML 内容中的錨元素 — 比如 

    content.html#footnote1

    )。
  • 還可以有一個或多個 

    navPoint

     元素。NCX 使用嵌套的導航點表示層次結構的文檔。

    該文檔的結構非常簡單:隻有兩頁,不存在嵌套關系。就是說有兩個 

navPoint

 元素,它們的 

playOrder

 值按升序排列,從 1 開始。在 NCX 中可以命名這些章節,以便讀者跳到電子圖書不同的部分。

***NCX 和 OPF 中繼資料的交叉

    由于 NCX 源自其他标準,使用 NCX 編碼的資訊和 OPF 内容之間存在重複。如果通過程式生成 EPUB,這算不上什麼問題,因為同樣的代碼可輸出到兩個檔案中。兩個位置的資訊要一緻,不同的 EPUB 讀者可能使用不同位置的值。(可如果手工去編寫呢?)

***NCX 和 OPF spine 有什麼不同?

    兩者很容易混淆,因為兩個檔案都描述了文檔的順序和内容。要說明兩者的差別,最簡單的辦法就是拿印刷書來打比方:OPF spine 描述了書中的各個章節是如何實際連接配接起來的,比方說翻過第一章的最後一頁就看到第二章的第一頁。NCX 在圖書的一開始描述了目錄。目錄肯定會包含書中主要的章節,但是還可能包含沒有單獨分頁的小節。

    一條法則是 NCX 包含的 

navPoint

 元素通常比 OPF spine 中的 

itemref

 元素多。實際上,spine 中的所有項都會出現在 NCX 中,但 NCX 可能更詳細。

添加最後的内容

現在知道了 EPUB 需要的所有中繼資料,可以加入真正的圖書内容了。可以使用 下載下傳 的内容,也可以自己寫,隻要檔案名和中繼資料比對即可。

然後建立下列檔案和檔案夾:

  • title.html:圖書的标題頁。建立該檔案并在其中包含引用封面圖檔的 

    img

     元素,

    src

     的屬性值為

    images/cover.png

  • images:在 OEBPS 下建立該檔案夾,然後複制給定的示例圖檔(或者建立自己的圖檔)并命名為cover.png。
  • content.html:圖書的實際文字内容。
  • stylesheet.css:将該檔案放在和 XHTML 檔案相同的 OEBPS 目錄中。該檔案可以包含任意 CSS 聲明,比如設定字型或者文字顔色。

    現在我們基本了解了一點epub的結構和文檔的特點。高人可以手工地制作一本epub電子書了。當然少了最後打包的介紹。

用 ZIP 打包 EPUB 檔案

EPUB 規範的 OEBPS Container Format 讨論了 EPUB 和 ZIP,最重要的幾點是:

  • 檔案中的第一個檔案必須是 mimetype 檔案(參見本教程 Mimetype 一節)。mimetype 檔案不能被壓縮。這樣非 ZIP 工具就能從 EPUB 包的第 30 個位元組開始讀取原始位元組,進而發現 mimetype。
  • ZIP 檔案不能加密。EPUB 支援加密,但不是在 ZIP 檔案這一層上。

    在類UNIX作業系統上,使用 ZIP 2.3 可通過兩個指令來建立 EPUB ZIP 檔案,(這些指令假設目前工作目錄為 EPUB 項目。)

将 EPUB 打包成有效的 epub+zip 檔案

$ zip -0Xq my-book.epub mimetype $ zip -Xr9Dq my-book.epub *      

    第一個指令建立了一個新的 ZIP 檔案,并添加了沒有進行壓縮的 mimetype 檔案。第二個指令添加其他内容。選項 

-X

 和 

-D

 最大限度地減少 .zip 檔案中無關緊要的資訊;

-r

 遞歸地包含 META-INF 和 OEBPS 目錄的内容。

 -0:僅存貯,不壓縮。

 -9:壓縮得更好

 -q:安靜模式

 -r:遞歸壓縮子目錄

 -D:不加入目錄項

 -X:排除另外的檔案屬性

最後還是要檢查驗證一下生成的epub檔案。

EPUB 驗證

    雖然 EPUB 标準并不很難,但其 XML 檔案必須符合特定的模式。如果使用模式感覺的 XML 編輯器生成中繼資料和 XHTML,就能事半功倍。對 EpubCheck 包進行最後檢查

    Adobe 負責維護 EpubCheck 包,它是采用 Berkeley Software Distribution (BSD) 許可證的開源項目。它是一個可以作為獨立工具、Web 應用程式運作的 Java 程式,或者可以将它內建到在 Java Runtime Environment (JRE) 1.5 或更高版本下運作的應用程式中。

在指令行中運作非常簡單:

$ java -jar /path/to/epubcheck.jar my-book.epub

根據錯誤的情況會提示出錯誤的資訊,可以根據資訊進行修改。

繼續閱讀