什么是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
。
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:metadata
和meta
**两个子元素组成。
dc:metadata
元素,使用 Dublin Core, 有以下几种常见的元素:<dc:title>
:- 描述资源的名称或标题。
- 示例:
<dc:title>Introduction to XML</dc:title>
。
<dc:creator>
:- 描述资源的作者。
- 示例:
<dc:creator>John Doe</dc:creator>
。
<dc:subject>
:- 描述资源的主题或关键词。
- 示例:
<dc:subject>XML</dc:subject>
。
<dc:description>
:- 描述资源的详细说明或摘要。
- 示例:
<dc:description>This document provides an introduction to XML.</dc:description>
。
<dc:publisher>
:- 描述资源的出版商或发行者。
- 示例:
<dc:publisher>XYZ Publications</dc:publisher>
。
<dc:contributor>
:- 描述对资源的贡献者,可以是作者之外的其他人或实体。
- 示例:
<dc:contributor>Editor: Jane Smith</dc:contributor>
。
<dc:date>
:- 描述资源的日期,通常是创建日期或出版日期。
- 示例:
<dc:date>2022-01-21</dc:date>
。
<dc:type>
:- 描述资源的类型,如文本、图片、音频等。
- 示例:
<dc:type>Text</dc:type>
。
<dc:format>
:- 描述资源的格式或媒体类型,如PDF、JPEG、MP3等。
- 示例:
<dc:format>application/pdf</dc:format>
。
<dc:identifier>
:- 描述资源的唯一标识符,可以是一个URL、DOI(数字对象标识符)等。
- 示例:
<dc:identifier>https://example.com/document123</dc:identifier>
。
<dc:source>
:- 描述资源的源信息,通常指向另一个包含此资源的资源。
- 示例:
<dc:source>https://example.com/collection</dc:source>
。
<dc:language>
:- 描述资源的语言。
- 示例:
<dc:language>en</dc:language>
。
<dc:relation>
:- 描述资源与其他相关资源之间的关系。
- 示例:
<dc:relation>Is Part Of: XYZ Series</dc:relation>
。
<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>