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
根據錯誤的情況會提示出錯誤的信息,可以根據信息進行修改。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章