制作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