Web阅读器开发系列教程(入门篇)

作者:Sam

前言

最近我在慕课网发布了两门关于Web阅读应用开发的课程,采用Vue全家桶开发。免费课是入门级课程,初步实现了一个阅读器。实战课是进阶课程,实现了一个高性能的互联网阅读应用。两个项目都采用自适应布局,同时支持PC端和移动端,想要系统提升前端技能的同学不要错过。

免费课《快速入门Web阅读器开发》立即学习

免费课DEMO立即体验

实战课《Vue2.5 实战微信读书 媲美原生App的企业级web书城》立即学习

实战课DEMO立即体验

说明

本教程为系列教程,主要目的是向大家分享如何开发一个功能强大的Web阅读器,技术栈是Vue全家桶。

常见的电子书格式

在上一篇手记中,我介绍了阅读应用的常见功能与阅读器的实现原理,没有读过的同学可以点击这里。在开发阅读器之前,我们先要了解常见的电子书格式,如:txt、PDF、ePub和mobi等,下面简单介绍这些格式:

  • txt是纯文件文件,它无法支持多媒体格式,小说类应用中使用较多,但无法满足电子出版物的需求;
  • PDF是非常主流的电子书格式,但是在移动端下排版效果不佳,所以移动阅读很少采用PDF格式;
  • ePub是目前最主流的电子书格式,电子书内容采用html显示,由css控制样式,不论在PC端还是移动端都有非常好的显示效果,不足之处在于文件容量较大,而且解析时需要解压,会消耗性能,可以借助本地缓存技术来缓解这个问题;
  • mobi是亚马逊Kindle的电子书格式,需要在Kindle中阅读。

本教程主要讲解ePub阅读器的开发。

阅读器的开发路径

一个完整的ePub阅读器的开发流程大致如下:

  • 解析:获取图书的基本信息、目录信息、章节信息等
  • 渲染:在界面上展示电子书内容,支持屏幕尺寸自适应
  • 翻页:支持上一页和下一页的翻页操作
  • 字号:支持修改文字的字号大小
  • 字体:支持修改文字的字体,能够支持CSS3的Web字体
  • 主题:支持切换阅读器的背景色和文字颜色
  • 进度:支持动态切换阅读器的显示进度
  • 目录:支持多级目录展示,点击目录快速跳转到指定章节
  • 搜索:支持全文搜索和章节搜索
  • 书签:支持将当前的阅读位置保存为书签,并能回溯
  • 笔记:支持选中一段文本后加入笔记
  • 适配:针对PC端和移动端进行专门的适配处理

上一篇手记为大家粗略展示了阅读器的开发流程,接下来的系列教程我将由浅入深,为大家详细介绍如何开发一个阅读器。

ePub标准

正式开发之前,我们需要了解什么是ePub标准。ePub是Electronic Publication(电子出版物)的缩写,它是IDPF制定的电子出版物标准。

IDPF介绍

  • IDPF是一个国际组织,全名是国际数字出版论坛,官网是www.idpf.org,它的使命是致力于电子出版物的推广,ePub就是该组织制定的标准。
  • IDPF的董事会有14个席位,收入来源是会员单位的会员费,目前IDPF拥有200多家会员单位,年收入100万美元的公司,每年需支付775美元的会费,以此类推,加入IDPF会员就有机会参与董事会席位竞争或参与电子出版物标准的制定等。
  • IDPF的主要工作是制定、完善和推广ePub标准,主要用于解决纸质书的电子化问题,包含分发、管理和加密等等。

资料来源:idpf.org/about-us

ePub标准介绍

ePub标准目前已经推出3.0版本,它包含以下几个部分:

  • EPUB Publications:规定了ePub标准的整体规范和基本语义,比如什么是Spine,什么是Manifest。这样做的目的是为了使不同出版社的ePub电子书都按照同一标准生产,以保证不同的阅读器可以正确地解析同一本电子书;
  • EPUB Content Documents:规定了ePub的内容标准,如何采用XHTML、 SVG 和 CSS 展示电子书内容;
  • EPUB Open Container Format:规定了ePub的封装标准,如何将一组文件打包成一个ePub文件;
  • EPUB Media Overlays:规定了文本和音频的同步处理模型,目前大部分ePub电子书中没有涉及该内容。

想要深入研究ePub标准的同学点击这里,官方为我们提供了非常详细的文档。

ePub电子书剖析

下面我们来看看一本ePub电子书的内部结构,测试电子书点击这里下载。

解压

将电子书的后缀名改为zip,之后用解压软件进行解压,可以得到一个文件夹,如下图所示:

container.xml

打开电子书目录,在META-INF目录下有一个container.xml文件,这是电子书的容器文件(Container),阅读器解析ePub电子书就是从这个文件开始的。

ePub标准对Container有非常严格的规定,主要内容如下:

  • ePub电子书根路径下必须存在一个META-INF目录
  • ePub电子书在META-INF目录下必须包含一个名称为container.xml的文件(注意:名称不能更改,否则会导致解析失败)
  • container.xml文件必须不能加密
  • container.xml中必须包含rootfiles标签,rootfiles下必须包含一个或多个rootfile标签,其中必须包含一个full-path属性指向电子书的配置文件,配置文件格式为opf(其实也是xml文件)

希望深入研究Container标准的同学可以点击这里,我们打开测试电子书的container.xml,内容如下:

xml version="1.0"?>
<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属性我们可以了解到在OEBPS目录下存在一个content.opf文件,我们打开OEBPS目录找到这个文件

通过代码编辑器打开这个文件,下面节选其中的关键内容:

xml version="1.0"?>
<package xmlns="http://www.idpf.org/2007/opf" unique-identifier="bookid" version="2.0">
    <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
        <dc:title>Agile Processes in Software Engineering and Extreme Programmingdc:title>
        <dc:creator>Juan Garbajosa, Xiaofeng Wang and Ademar Aguiardc:creator>
        <dc:language>Endc:language>
        <dc:rights>dc:rights>
        <dc:publisher>Springer International Publishing, Chamdc:publisher>
        <dc:identifier id="bookid">978-3-319-91602-6dc:identifier>
        <meta name="cover" content="A978-3-319-91602-6_CoverFigure_IMG"/>
        <meta name="epub-converter-version" content="v3.47"/>
    metadata>

    <manifest>
        <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
        <item id="css1" href="springer_epub.css" media-type="text/css"/>
        <item id="A468350_1_En_1_ChapterPart1" href="A468350_1_En_1_ChapterPart1.html"
              media-type="application/xhtml+xml"/>
        <item id="A468350_1_En_1_Chapter" href="A468350_1_En_1_Chapter.html" media-type="application/xhtml+xml"/>
        <item id="A468350_1_En_5_Fig1_HTML_IMG" href="A468350_1_En_5_Fig1_HTML.gif" media-type="image/gif"/>
        ...
    manifest>
    
    <spine toc="ncx">
        <itemref idref="ACoverHTML"/>
        <itemref idref="A468350_1_En_BookFrontmatter_OnlinePDF"/>
        <itemref idref="A468350_1_En_1_ChapterPart1"/>
        <itemref idref="A468350_1_En_1_Chapter"/>
        <itemref idref="A468350_1_En_2_Chapter"/>
        <itemref idref="A468350_1_En_3_ChapterPart2"/>
        ...
    spine>
    
    <guide>
        <reference type="cover" title="Cover" href="ACoverHTML.html"/>
        <reference type="toc" title="Table of Contents" href="A468350_1_En_BookFrontmatter_OnlinePDF.html#Toc"/>
        <reference type="text" title="Cosmic User Story Standard" href="A468350_1_En_1_Chapter.html"/>
    guide>
package>
复制代码

ePub标准规定一个opf文件根标签为package,其中必须包含metadata、manifest和spine,guide、bindings和collection属于可选项

  • metadata:电子书的出版信息
  • manifest:电子书的资源文件路径和id
  • spine:电子书的阅读顺序
  • guide:导读信息

metadata

metadata遵循DCMES(Dublin Core Metadata Element Set:都柏林核心元素)的规定,DCMES的目的是为了规范电子信息的描述,详细了解DCMES可以点击这里。ePub规定metadata下必须至少包含以下三个元素:

  • dc:title - 电子书标题
  • dc:language - 语种
  • dc:identifier - 电子出版物的唯一标识,通常是ISBN号(International Standard Book Number:国际标准书号,专门为识别图书等文献而设计的国际编号)
 <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
        <dc:title>Agile Processes in Software Engineering and Extreme Programmingdc:title>
        <dc:language>Endc:language>
        <dc:identifier id="bookid">978-3-319-91602-6dc:identifier>
    metadata>
复制代码

manifest

manifest存储了电子书资源文件的详尽列表

<manifest>
        <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
        <item id="ACoverHTML" href="ACoverHTML.html" media-type="application/xhtml+xml"/>
manifest>
复制代码
  • item - 表示一个资源
  • id - 资源在电子书中的唯一标识
  • href - 资源的存储路径
  • media-type - 资源的媒体类型

spine

提供电子书阅读的顺序

<spine toc="ncx">
        <itemref idref="ACoverHTML"/>
        <itemref idref="A468350_1_En_BookFrontmatter_OnlinePDF"/>
spine>
复制代码
  • itemref - 表示一个资源
  • idref - 表示资源的id,与manifest中的id对应,实际解析过程中会通过spine的id到manifest中寻找相应的资源,交由阅读器进行展示

ePub标准小结

ePub标准的核心是利用zip技术,将不同类型的文件打包为一个ePub文件,利用xml技术进行配置管理,结合ePub标准的规定将各类资源文件(如html、css、图片、音频和视频)有序地组织起来,从而保证了各类阅读器解析时的一致性。

总结

本文向大家介绍了电子书的常见格式,并详细讲解了ePub标准。理解ePub标准是开发电子书阅读器的一个前提,大家可以动手尝试将本文提供测试电子书解压,然后进行分析,也可以通过互联网通过其他ePub电子书尝试解析,看看它们是否符合ePub标准。

转载于:https://juejin.im/post/5bcfe5206fb9a05d30179581

你可能感兴趣的:(Web阅读器开发系列教程(入门篇))