什么是epub

epub是由国际数字出版论坛(International Digital Publishing Forum,简称为IDPF)提出的一种自由开放的电子图书标准,使用它可以呈现固定布局排版的文档,也可以实现内容自动重排。

内容重排的最大优势在于可以根据阅读设备的尺寸呈现电子书。

epub格式是在1999年开放电子图书论坛(Open eBook Forum,简称OeBF,后来OeBF改名为「IDPF」)提出的OEBPS格式基础上,经过不断研究和改进而形成的。1999年9月,OeBF正式发布开放电子图书出版结构规范1.0版(Open eBook Publication Structure 1.0,简称OEBPS 1.0)。

随后,OEBPS1.0经历了两次更新。一次是2001年6月,OeBF出版结构工作组发布OEBPS 1.0.1;另一次是2002年8月发布了OEBPS 1.2。2003年IDPF着手制定OEBPS 2.0规范,但因种种原因未能实现目标,这项工作后来成为epub2.0标准的基础。在前期工作的基础上,为了对OEBPS制定一个单一的文档容器格式,2006年10月IDPF发布OCF 1.0(Open Container Format),OCF 1.0也可以说是最初的epub 1.0。2007年9月IDPF发布OPF 2.0(Open Packaging Format)及OPS 2.0(Open Publiccation Structure),也即我们说的epub 2.0标准。

2009年,IDPF开始修订epub标准,在2010年7月正式发布epub 2.0.1。epub 2.0.1由OPS 2.0.1、OPF2.0.1和OCF2.0.1组成。2011年2月15日,IDPF发布了历时7个月完成的epub 3.0第一草案,随后5月23日发布epub 3.0格式规范建议细则,并开始接受公众评议。2011年10月IDPF会员在法兰克福开会,投票通过了最终版本的epub 3.0格式标准细则。

2014年6月26日,epub 3.0.1发布,作为3.0的小维护更新。2017年1月5日发布epub 3.1,对文字的格式规范进行了重组和清理。

2017年1月30日,IDPF与W3C合并(新闻稿),作为会员组织存在的IDPF已停止运营。该网站只作为一个档案保存站点,有关epub的更多信息请访问PUBLISHING@W3C。

epub的文件结构

epub文件本质是一个zip压缩文件,用winhex随便打开一个epub文件,就能看到zip文件的文件头50 4B 03 04

pFV0pxP.png

epub以xml、css和xhtml为基础,xml作为信息和配置文件,xhtml用于编写文本内容,css负责排版和渲染,可以索引外部资源。

[乙野四方字].我会呼唤你的名字.epub为例,将文件重命名为[乙野四方字].我会呼唤你的名字.zip,用压缩文件解压后会有如下文件结构,其中部分文件被省略:

│  mimetype
│
├─META-INF
│      container.xml
│
└─OEBPS
    │  content.opf
    │  toc.ncx
    │
    ├─Fonts
    │      ziti1-1.ttf
    │      ...
    ├─Images
    │      cover.jpg
    │      note.png
    │
    ├─Styles
    │      style.css
    │
    └─Text
            contents.xhtml
            ...

其中,mimetype和META-INF/container.xml是固有文件,在epub文件中是必定存在的,而且位置也是固定的。

mimetype

mimetype是一个文本文件,内容固定为:application/epub+zip

META-INF文件夹

META-INF用于存放信息,默认情况下该目录包含一个文件,即container.xml,内容一般为如下内容:

<?xml version="1.0" encoding="UTF-8"?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
    <rootfiles>
        <rootfile full-path="OEBPS/content.opf" media-type="application/oebps-package+xml"/>
   </rootfiles>
</container>

其中rootfile的属性full-path指定了此书的OPF文件路径。

除此之外,META-INF可能含有这些文件:

  • manifest.xml 文件列表
  • metadata.xml 元数据
  • signatures.xml 数字签名
  • encryption.xml 加密
  • rights.xml 权限管理

这些文件不是必要的,不必过于关心。

OEBPS文件夹

一般情况下,OEBPS文件夹用于存放真正的图书内容,包括 content.opf 文件,toc.ncx 文件,正文内容,css 样式文件,字体文件,图片等。

除了content.opf 文件和toc.ncx 文件,其它文件夹一般用于存放资源文件,比如:

  • Fonts:字体文件
  • Images:图片
  • Styles:css文件
  • Text:xhtml文件

OPF文件

opf 文件是 epub 最为重要的文件,是标准的 xml 文件。

根元素是**<package>**,有以下属性:

  • xmlns: 指定XML命名空间,通常为 http://www.idpf.org/2007/opf
  • version: 指定所使用的EPUB规范的版本,例如 "3.0"。
  • unique-identifier: 指定一个唯一的标识符,通常是电子书的主要标识符。

比如:

<!-- BookId实际上是一个Id,在<metdata中定义,详见下文> -->
<package version="2.0" unique-identifier="BookId" xmlns="http://www.idpf.org/2007/opf">

子元素由以下及部分组成:

第一部分为<metadata> ,包含了关于电子书的元数据信息,如标题、作者、标识符、出版商、出版日期等。主要由**dc:metadatameta**两个子元素组成。

  • dc:metadata 元素,使用 Dublin Core, 有以下几种常见的元素:
    1. <dc:title>
      • 描述资源的名称或标题。
      • 示例:<dc:title>Introduction to XML</dc:title>
    2. <dc:creator>
      • 描述资源的作者。
      • 示例:<dc:creator>John Doe</dc:creator>
    3. <dc:subject>
      • 描述资源的主题或关键词。
      • 示例:<dc:subject>XML</dc:subject>
    4. <dc:description>
      • 描述资源的详细说明或摘要。
      • 示例:<dc:description>This document provides an introduction to XML.</dc:description>
    5. <dc:publisher>
      • 描述资源的出版商或发行者。
      • 示例:<dc:publisher>XYZ Publications</dc:publisher>
    6. <dc:contributor>
      • 描述对资源的贡献者,可以是作者之外的其他人或实体。
      • 示例:<dc:contributor>Editor: Jane Smith</dc:contributor>
    7. <dc:date>
      • 描述资源的日期,通常是创建日期或出版日期。
      • 示例:<dc:date>2022-01-21</dc:date>
    8. <dc:type>
      • 描述资源的类型,如文本、图片、音频等。
      • 示例:<dc:type>Text</dc:type>
    9. <dc:format>
      • 描述资源的格式或媒体类型,如PDF、JPEG、MP3等。
      • 示例:<dc:format>application/pdf</dc:format>
    10. <dc:identifier>
      • 描述资源的唯一标识符,可以是一个URL、DOI(数字对象标识符)等。
      • 示例:<dc:identifier>https://example.com/document123</dc:identifier>
    11. <dc:source>
      • 描述资源的源信息,通常指向另一个包含此资源的资源。
      • 示例:<dc:source>https://example.com/collection</dc:source>
    12. <dc:language>
      • 描述资源的语言。
      • 示例:<dc:language>en</dc:language>
    13. <dc:relation>
      • 描述资源与其他相关资源之间的关系。
      • 示例:<dc:relation>Is Part Of: XYZ Series</dc:relation>
    14. <dc:rights>
      • 描述资源的版权和使用权限。
      • 示例:<dc:rights>Copyright © 2022, All Rights Reserved</dc:rights>
  • meta 标签,扩展元素,如果有信息在上面标签中无法描述,则扩展到该 meta 中。
    • 示例:<meta name="cover" content="cover.jpg"/>

比如:

  <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
    <dc:title>我会呼唤你的名字</dc:title>
    <dc:creator opf:file-as="末影服" opf:role="aut">乙野四方字</dc:creator>
    <dc:language>zh</dc:language>
    <dc:subject>轻小说</dc:subject>
    <dc:description>EPUB制作:末影服</dc:description>
    <dc:date opf:event="modification">2022-10-07</dc:date>
    <meta content="1.7.0" name="Sigil version"/>
    <dc:identifier id="BookId" opf:scheme="UUID">urn:uuid:5208e6bb-5d25-45b0-a7fd-b97d79a85fd4</dc:identifier>
      <!-- cover.jpg实际上是一个文件id,详见下文,而不是文件路径,添加封面 -->
    <meta name="cover" content="cover.jpg"/>

第二部分为<manifest>,列举了电子书中包含的所有文件(资源),如文档、图像、样式表等,每一行由一个 item 构成。比如:

<item id="cover.jpg" href="Images/cover.jpg" media-type="image/jpeg"/>

其中:

  • id 为文件 id
  • href 为文件相对路径
  • media-type 为文件的媒体类型

例如,文件有删减:

<manifest>
    <item id="Section001.xhtml" href="Text/Section001.xhtml" media-type="application/xhtml+xml"/>
    <item id="Section002.xhtml" href="Text/Section002.xhtml" media-type="application/xhtml+xml"/>
    <item id="Section003.xhtml" href="Text/Section003.xhtml" media-type="application/xhtml+xml"/>
    <item id="Summary.xhtml" href="Text/Summary.xhtml" media-type="application/xhtml+xml"/>
    <item id="contents.xhtml" href="Text/contents.xhtml" media-type="application/xhtml+xml"/>
    <item id="cover.jpg" href="Images/cover.jpg" media-type="image/jpeg"/>
    <item id="cover.xhtml" href="Text/cover.xhtml" media-type="application/xhtml+xml"/>
    <item id="message.xhtml" href="Text/message.xhtml" media-type="application/xhtml+xml"/>
    <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
    <item id="note.png" href="Images/note.png" media-type="image/png"/>
    <item id="style.css" href="Styles/style.css" media-type="text/css"/>
    <item id="title.xhtml" href="Text/title.xhtml" media-type="application/xhtml+xml"/>
    <item id="ziti2.ttf" href="Fonts/ziti2.ttf" media-type="font/ttf"/>
    <item id="ziti3.ttf" href="Fonts/ziti3.ttf" media-type="font/ttf"/>
  </manifest>

第三部分为 <spine toc="ncx"> ,提供图书顺序阅读的次序,由子元素 itemref 组成。

<itemref idref="cover.xhtml">

其中, idref 为 manifest 中定义的 id。

  <spine toc="ncx">
    <itemref idref="cover.xhtml" properties="duokan-page-fullscreen"/>
    <itemref idref="title.xhtml"/>
    <itemref idref="message.xhtml"/>
    <itemref idref="Summary.xhtml"/>
    <itemref idref="contents.xhtml"/>
    <itemref idref="Section001.xhtml"/>
    <itemref idref="Section002.xhtml"/>
  </spine>

第四部分为 <guide> ,列出了电子书的特定页面,比如封面,目录,序言等等,属性值指向文件地址,该部分可选。

  <guide>
    <reference type="toc" title="Table Of Contents" href="Text/contents.xhtml"/>
    <reference type="cover" title="Cover" href="Text/cover.xhtml"/>
  </guide>

第五部分为<tour> 导读,根据读者的不同水平,按照一定次序选择电子书部分页面组成导读,该部分可选。

NCX文件

NCX文件是epub电子书的又一个核心文件,用于制作电子书的目录,ncx文件也是一个xml文件。

以解压[乙野四方字].我会呼唤你的名字.zip得到的toc.ncx文件为例。

<head>
    <meta name="dtb:uid" content="urn:uuid:5208e6bb-5d25-45b0-a7fd-b97d79a85fd4"/>
    <meta name="dtb:depth" content="2"/>
    <meta name="dtb:totalPageCount" content="0"/>
    <meta name="dtb:maxPageNumber" content="0"/>
</head>

这是ncx文件的头部,用<head>定义。其中,<meta name="dtb:uid" content="urn:uuid:5208e6bb-5d25-45b0-a7fd-b97d79a85fd4"/>要和opf文件中的dc:identifier保持一致,不一致也行。剩下的三个不需要进行修改,使用这几个值就行。

<docTitle>
    <text>作品名</text>
</docTitle>

需要与opf文件中的dc:title一致,书名以opf中的为准,不一致也行。

ncx 文件中最主要的节点是 navMap,navMap 节点又由很多 navPoint 节点组成,navPoint 节点由 navLabel 和 content 节点组成。

navPoint 节点中,playOrder 属性定义当前项在目录中的次序,text 子节点则定义了目录的名字。content 子节点 src 属性定义了章节文件的具体位置。

navPoint 节点可以嵌套,形成了整本书的层级结构。

  <navMap>
    <navPoint id="navPoint-1" playOrder="1">
      <navLabel>
        <text>封面</text>
      </navLabel>
      <content src="Text/cover.xhtml"/>
    </navPoint>
    <navPoint id="navPoint-2" playOrder="2">
      <navLabel>
        <text>制作信息</text>
      </navLabel>
      <content src="Text/message.xhtml"/>
    </navPoint>
   ...
    <navPoint id="navPoint-29" playOrder="29">
      <navLabel>
        <text>终章,又或是在世界的某处</text>
      </navLabel>
      <content src="Text/Section009.xhtml"/>
    </navPoint>
  </navMap>

创建epub文件

将解压出来的META-INF、OEBPS、minetype压缩为一个zip文件,压缩级别选择仅存储。将.zip扩展名改为.epub即可。