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
根据错误的情况会提示出错误的信息,可以根据信息进行修改。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值