制作EPUB电子书

目录

之前一篇博文《制作网络小说的电子书》中下载 HTML 网页,并使用 calibre 制作 epub 电子书。 如此制作电子书需要安装体积不算小巧的软件,不太方便。 本文介绍使用 Python 库 ebooklib 制作 EPUB 电子书的方法。

为什么是EPUB格式?

我的 Kindle 中都是 MOBI 格式的电子书,但为什么不直接制作 MOBI 的电子书,这样就不需要格式转换了。 因为 MOBI 格式不开源,能制作 MOBI 格式图书的库不多。 看过一些制作 MOBI 格式的库,使用 Amazon 提供的转换程序生成 MOBI 书籍。 目前还缺少有效的方式直接生成 MOBI 格式,所以我先选择 EPUB 格式,再使用 Calibre 转成 MOBI 格式。

准备工作

需要将电子书的每个章节保存成一个单独的HTML文件,可以使用《制作网络小说的电子书》和《[使用Python下载网络小说](https://blog.perillaroc.wang/post/2017/2017-11-29-download-online-novel-using-python/》提到的方法制作电子书。 另外需要准备章节目录,至少包括每个章节的标题和HTML文件位置。 例如,可以使用下面的数据结构:

{
    "author": "皇甫奇",
    "contents": [
        {
            "file_path": "./4641557.html",
            "link": "//www.yunlaige.com/html/9/9313/4641557.html",
            "name": "作者语"
        },
        {
            "file_path": "./4641558.html",
            "link": "//www.yunlaige.com/html/9/9313/4641558.html",
            "name": "序章 纪元的毁灭和开始"
        },
        {
            "file_path": "/4641559.html",
            "link": "//www.yunlaige.com/html/9/9313/4641559.html",
            "name": "第一章 杨纪"
        }
    ],
    "title": "帝御山河最新章节"
}

上述文件可以由下载网页的程序自动生成,保存在网页目录下。

生成 EPUB 电子书

EPUB 电子书至少要包括以下几个部分:

  • 基本信息:标题、作者
  • 目录:带跳转功能的目录
  • 章节内容:HTML文件集合

下面创建包含上面元素的电子书。
创建电子书对象

book = epub.EpubBook()

添加基本信息

book.set_title(title)
book.add_author(author)

首先依次添加章节内容

chapter = epub.EpubHtml(title=name, file_name=file_name)
with open(file_path, encoding='utf-8') as f:
    chapter_html = f.read()
    chapter.content = chapter_html
book.add_item(chapter)

在添加章节时,同时创建目录项目,并将章节保存到一个列表中,在上面的代码后添加两行:

chapter = epub.EpubHtml(title=name, file_name=file_name)
with open(file_path, encoding='utf-8') as f:
    chapter_html = f.read()
    chapter.content = chapter_html
book.add_item(chapter)
chapter_list.append(chapter)
toc_list.append(epub.Link(file_name, name, file_name))

添加完所有章节后,创建目录,并自动生成目录导航页。

book.toc = tuple(toc_list)
book.add_item(epub.EpubNcx())
book.add_item(epub.EpubNav())

设置图书元素的顺序,依次为导航和各个章节:

book.spine = ['nav'] + chapter_list

最后将图书保存成文件

epub.write_epub(output_file, book, {})

参考

ebooklib