2019独角兽企业重金招聘Python工程师标准>>>

第四章、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

第四章、epub文件处理 -- epub文件内部组成相关推荐

  1. 第四章:数据存储-csv文件处理-读取csv文件的两种方式

    直接学习:https://edu.csdn.net/course/play/24756/280718 csv文件处理-读取csv文件的两种方式: # 这种方式读取到的每一条数据是个列表,所以需要通过下 ...

  2. 2022-3-1 王爽《汇编语言》第四章 实验

    一.调大窗口 原来的窗口太小了,快看瞎了,全屏又不好截图.下面是放大屏幕的方法. 在 dosbox 的配置文件中将 DOSBox 0.74-3 Options 当中的 改为: 参考文章:调整DOSBO ...

  3. 第六章、epub文件处理 -- 解析container文件与.opf文件

    2019独角兽企业重金招聘Python工程师标准>>> 第六章.epub文件处理 -- 解析container文件与.opf文件 这一章我们会接着第三章结尾介绍的FBReaderAp ...

  4. 操作系统:第四章 文件管理1 - 文件逻辑结构,物理结构,文件目录,软硬连接,文件系统

    本文已收录至 Github(MD-Notes),若博客中有图片打不开,可以来我的 Github 仓库:https://github.com/HanquanHq/MD-Notes,涵盖了互联网大厂面试必 ...

  5. 第十一、十二、十三、十四章 网络配置管理、归档和远程复制同步文件、软件包管理、创建访问linux文件系统

    第十一章 网络配置管理 网络地址获取方式: 1)DHCP自动获取 2)手动配置 1.网卡配置文件: /etc/sysconfig/network-scripts/ [root@server0 Desk ...

  6. epub是什么文件?epub文件怎么打开?

    EPUB 属于一种可以"自动重新编排"的内容:也就是文字内容可以根据阅读设备的特性,以最适于阅读的方式显示. EPUB 解决了 PDF 和开发人员友好性有关的所有瑕疵.一个 EPU ...

  7. epub文件是什么文件?哪里有epub图书资源?如何打开?

    ​ EPUB是一种电子文档格式. 如同word txt pdf一样可以承载很多文字信息.但在这种格式中,使用了不同的开放标准.区别在于,EPub文件属于一种可以"自动重新编排"的文 ...

  8. 如何在 Linux 中使用 Calibre 将 PDF 文件转换为 EPUB 格式?

    在这个现代时代,一切都被数字化了,电子书已成为主流,电子书有多种格式,如 PDF.EPUB.MOBI.AZW3 和 IBA 等. 大多数电子书阅读器支持几乎所有格式,但是,某些电子书阅读器可能不支持特 ...

  9. 第四章 文件的基本管理和XFS文件系统备份恢复 随堂笔记

    第四章 文件的基本管理和XFS文件系统备份恢复 本节所讲内容: 4.1 Linux系统目录结构和相对/绝对路径. 4.2 创建/复制/删除文件,rm -rf / 意外事故 4.3 查看文件内容的命令 ...

最新文章

  1. LeetCode简单题之二分查找
  2. 刻意练习:LeetCode实战 -- Task15. 有效的括号
  3. 数字新消费重塑新中部,岳麓峰会再汇“长沙内能”
  4. javaweb利用struts2完成批量删除记录
  5. [CQOI2009]叶子的染色(树形dp)
  6. 算法题指南书_分类算法指南
  7. php与服务器关系,php与web服务器关系
  8. C语言scanf:获取输入的内容
  9. python-发邮件脚本
  10. 【MySQL】故障分析 | MySQL 优化案例 - 字符集转换
  11. IT人必去的几大网站,国内外知名IT网站罗列!
  12. Hadoop3——集群搭建以及初体验
  13. Elasticsearch 实战2:ES 项目实战(二):基本操作、批处理、高级查询
  14. 为什么南通的方言会有这么多?
  15. 群体智能优化算法之狩猎搜索(Hunting Search,Hus)
  16. gstreamer中查看有哪些元素以及元素的属性(参数)
  17. 网络通信词汇——MCC、MNC、dbm、TAC、ECI、PCI、BAND、EARFCN、FREQ、RSSI、RSRP、RSRQ、SINR
  18. sql语句 两表关联查询计算数量
  19. Excel怎么将两个表格数据合并为一个
  20. golang:IO File 操作

热门文章

  1. oracle监听为blocked,关于“Instance +ASM1, status BLOCKED, ”
  2. android 通知_Android 全局消息通知框架实现(类似EventBus)
  3. httpservletrequest 设置请求头_请求和常用对象
  4. php中循环跳过,php for循环的exit / break / continue /goto 停止、跳过循环、继续循环...
  5. 鼠标移动响应php程序,jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】...
  6. element vue 纵向滑动条_Vue 部分
  7. 对广义表L=((a,b),c,d)进行操作tail(head(L))的结果是
  8. Elasticsearch查询性能优化
  9. 2022年科技与IT十大趋势
  10. 产品经理,你该如何做好后台规划