第四章、epub文件处理 -- epub文件内部组成

第四章、epub文件处理 -- epub文件内部组成


第三章的结尾,我们说到从FBReaderApp类的openBookInternal方法,就要开始对epub文件的处理流程了。

在对这个流程进行详细的分析之前,我们有必要先用一个章节详细介绍一下epub文件的内部组成。

首先,epub文件一种压缩文件,是压缩格式是与zip压缩文件是一样的。换一句话说,epub文件是可以用支持zip格式的解压缩文件解压的(有些软件不能识别epub后缀名,需要手动把.epub的后缀名改成.zip)。

把epub文件解压之后,打开文件夹,我们可以看到有如下的文件与文件夹,我们一个一个来看一下。


META-INF文件夹

这个文件文件夹的名字翻译成中文就是“元信息”。文件夹里面只有一个container.xml文件

container.xml文件

文件的内容如下:

这段内容的作用就是标明了.opf文件的位置。这个.opf文件是一个很重要的文件,它记录了epub文件内部各个文件的具体信息,我们会在介绍OPS文件夹的时候详细介绍这个文件。

程序必须正确解析.opf文件的内容后才能正常运行,但是.opf这个文件的文件名本身却是可以自定义的,也就是说,不同的epub文件里面可能包含不同名字、位于不同行位置的.opf文件。那么,如何确保程序能够正确找到并解析.opf文件呢,就是通过container.xml这个文件来指定.opf文件。正是基于这个原因,epub文件的标准里规定“EPUB 根目录下必须包含 META-INF 目录,而且其中必须要有一个文件 container.xml”(引用自http://blog.sina.com.cn/s/blog_6441e0640100gmhv.html)。

大家可以试一下,如果你把解压后的epub文件里的container.xml文件改名后再重新压缩成epub文件,程序就会报错。


OPS文件夹

OPS文件夹主要包含三种重要的文件.opf文件、ncx文件、.xhtml文件。同时,还可能会有css文件和图片文件。下面详细介绍下这些文件。


.opf文件

opf代表“Open Packaging Format”,意译成中文差不多应该是“EPUB文件包格式”。我们说过epub文件是个zip压缩文件,opf文件的作用可以被理解为描述了EPUB文件解压后,内部各个文件和文件夹的名字、位置等信息。

.opf文件主要包含三个主要的节点metadata、manifest、spine,这个三个节点分别描述了不同信息。


其中,metadata节点定义了epub的作者、书名、语言等元信息。这些元信息大部分都在dc的命名空间下。dc代表Dublin Core,意指国际组织“Dublin Core Metadata Initiative”定义的标准。


manifest节点的作用是描述epub文件内部对应不同章节对应的文件的位置。manifest节点在这里的作用有点像之前提到的container.xml文件:container定义了.opf文件的位置,而manifest节点中的item子节点的href属性则定义了含有对应每个章节的文件的位置。


spine节点的作用是定义读者在顺序阅读时,每个章节出现的先后次序。linear这个节点的作用是这样的:“ EPUB 规范的阅读系统将首先打开 spine 中没有设置为 linear=no 中的第一项”。所以,“建议将封面定义为 linear=no”。(引用自http://blog.sina.com.cn/s/blog_6441e0640100gmi8.html) 

    我们可以看到,我们的测试epub文件似乎并没有严格按照epub规范将封面的linear属性设置为“no”。正因为如此,第一次打开测试文件的时候,默认的第一页是封面而不是正文。


.ncx文件

ncx代表“Navigation Center eXtended”,意思大致就是导航文件,这个文件与目录有直接的关系。

.ncx文件中最主要的节点是navMap。navMap节点是由许多navPoint节点组成的。而navPoint节点则是由navLabel、content两个子节点组成。

navPoint节点中,playOrder属性定义当前项在目录中显示的次序。

navLabel子节点中的text节点定义了每个目录的名字。

content子节点的src属性定义了对应每个章节的文件的具体位置。

看到这里,可能会有有人觉得.opf文件与.ncx文件有一点重复:.opf文件的item节点中的href属性描述了各个章节文件的位置与顺序,.ncx文件中的conten节点中的src属性也描述了各个章节文件的位置与顺序。其实他们还是有区别的,区别就在于,.opf文件定义的是读者在顺序阅读时会用到的章节文件与它们的顺序,.ncx文件则定义的是目录中会用到的章节文件与它们的顺序。如果存在某些附件性质的内容被希望在目录中出现,但却不希望在读者顺序阅读的时候出现时,那么就可以通过对.opf文件和.ncx文件进行不同的设置来达到这个目的。当然,大部分的时候,.opf与.ncx这两个文件的内容基本是重合的。


.xhtml文件

.xhtm文件就是存储每个章节具体内容。按照epub的规范,存储具体内容的文件应该是xhtml为后缀名(参照http://zh.wikipedia.org/wiki/EPUB),但是似乎并不是每个epub里面都用xhtml作为存储具体内容的文件的后缀名。比如,我们的测试文件就使用了html作为后缀名,我还看到过htm作为后缀名的。但其实不管用什么作为后缀名都不会有问题,因为在.opf和.ncx文件已经准确定义文件的位置和后缀名。同时,不管epub文件使用了什么后缀名,FBReader程序都是使用XHTMLReader类来处理这些文件。


样式文件

样式文件的作用是定义一些文本信息显示的格式。并不是每一个epub文件内部都会附有样式文件,没有样式文件的情况下,就会使用程序默认的样式文件。

在FBReader程序1.0的版本里面并没有专门读取epub文件内部样式文件的类。1.0的版本直接使用了/asstes/default/style.xml作为默认的样式文件。不管是epub文件是否附有自带的样式文件文件,1.0的版本都使用的是这一套样式文件的格式。2.0的版本增加了读取自定义样式文件文件的功能。大家可以在1.0版本和2.0版本下分别打开Quiet这本书(这个文件只作为测试用,请支持正版,多看中译版购买地址),就可以明显看到样式文件格式的不同。

1.0版本中的css解析类:ZLTextStyleCollection


2.0的版本中的样式文件解析类:


1.0版本显示效果:


2.0版本显示效果(标题与小字部分都使用epub文件内置的样式文件)



图片文件

图片文件一般集中存储在一个文件夹里面。最常见的图片的文件就是封面图片。封面图片的位置会在.opf文件标明。




Mimetype文件

这个文件的内容很简单,只有一行:application/epub+zip。其实这行内容就是表明了epub文件的mimetype属性。搞过网页的朋友应该挺熟悉这个mimetype属性的,html文件的mimetype属性就是text/html,样式文件文件的mimetype属性是text/样式文件,js文件的mimtype属性则是application/javascript。

根据epub的标准,epub根目录下必须包含mimetype文件,文件名与内容都不能变。不过,我仔细看了下FBReader代码,并没有发现专门针对这个文件的部分。我有试着把这个miemtype文件删掉然后再重新压缩成epub文件。FBReader程序还是能正常打开这个文件。总而言之,按照标准,mimetype文件必须有,而且文件名与内容都不能变。不过,实际操作起来,没有mimetype文件,FBReader一样能正常打开epub文件。



如果大家想更深入得了解epub文件的组成,可以参考下这个博客的相关内容。

http://blog.sina.com.cn/s/blog_6441e0640100gmfe.html

http://blog.sina.com.cn/s/blog_6441e0640100gmhv.html

http://blog.sina.com.cn/s/blog_6441e0640100gmi8.html

http://blog.sina.com.cn/s/blog_6441e0640100gmj9.html



转载于:https://my.oschina.net/u/938986/blog/335833

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值