Table of Contents
我没有阅读 EPUB3 标准文档,所以这里的文字只是根据网上的文章总结的一个可行结构。
│ mimetype
├─EPUB
│ │ package.opf
│ ├─images
│ │ cover.png
│ ├─styles
│ │ main.css
│ └─text
│ cover.xhtml
│ nav.xhtml
│ 简介.xhtml
└─META-INF
container.xml
接下来根据文件结构解释文件作用和内容。
mimetype
这个文件位于根目录,指定文件格式,内容固定为:application/epub+zip
META-INF
这个文件夹是存放文件信息的,只有一个文件:container.xml:
<?xml version="1.0"?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
<rootfiles>
<rootfile full-path="EPUB/package.opf"
media-type="application/oebps-package+xml" />
</rootfiles>
</container>
EPUB
书籍的内容都在这个文件夹里。
package.opf
书籍的元信息、文件清单、阅读顺序等都在 package.opf 文件里。这个文件名称和 container.xml 里的 rootfile 对应。当然,文件可以不叫这个名字,只要是 opf 文件就可以。
<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://www.idpf.org/2007/opf" version="3.0" unique-identifier="uid" xml:lang="en-US" prefix="cc: http://creativecommons.org/ns#">
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:identifier id="uid">5159da60</dc:identifier>
<dc:title>文昌孝经</dc:title>
<dc:creator>sharebook.top</dc:creator>
<!-- <dc:language></dc:language> -->
<dc:date>2023-09-28 21:31:23</dc:date>
<meta property="dcterms:modified">2023-09-28 21:31:23</meta>
<meta name="cover" content="cover" />
</metadata>
<manifest>
<item id="简介" href="text/简介.xhtml" media-type="application/xhtml+xml" />
<item id="cover-page" href="text/cover.xhtml" properties="nav" media-type="application/xhtml+xml" />
<item id="nav" href="text/nav.xhtml" properties="nav" media-type="application/xhtml+xml" />
<item id="cover" href="images/cover.png" media-type="image/png" properties="cover-image" />
<item id="css" href="styles/main.css" media-type="text/css" />
</manifest>
<spine toc="ncx">
<itemref idref="cover-page" />
<itemref idref="nav" />
<itemref idref="简介" />
</spine>
<guide>
<reference type="toc" href="text/nav.xhtml" />
</guide>
</package>
上面的代码就是 opf 文件里的大致内容。
metadata 标签里的内容就是元数据,唯一标识、标题、创建人、日期之类的。需要注意的是 name 为 cover 的这个标签,这个标签的作用是指明文件的封面,这样阅读器应用可以据此显示缩略图。标签的 content 对应的不是路径,而是 manifest 里文件的 id。
manifest 部分是书籍内容的文件清单,包括样式、图片、各个页面等。
spine 部分是书籍的阅读顺序,比如示例代码里面从封面开始,然后导航,接着是简介。
guide 指定文件的页面,和 spine 作用差不多,阅读器据此显示目录。
内容
书籍的内容文件是 xhtml,以 nav.xhtml 为例:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html>
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:epub="http://www.idpf.org/2007/ops"
>
<head>
<title>文昌孝经</title>
<link
rel="stylesheet"
type="text/css"
href="../styles/main.css"
/>
</head>
<body>
<div>
<div><h1>文昌孝经</h1></div>
</div>
<nav
epub:type="toc"
id="toc"
>
<ol>
<li>
<a href="简介.xhtml">简介</a>
</li>
</ol>
</nav>
</body>
</html>
其内容基本就是 HTML,只不过多了些属性。比如 nav 标签多了 epub:type=”toc”。
然后有一个需要注意的是文件的引用路径需要是相对路径。我试过绝对路径,无法正确解析。
其他
在前端实现的时候,我还发现一个 jszip 的注意事项——添加 base64 图片的时候,需要将前导标识去掉。比如 data:image/png;base64, ,这几个字符是浏览器 dataurl 标识,不是 base64 的内容。